Vector = require './vector' module.exports.ArgumentError = class ArgumentError extends Error @className: "ArgumentError" constructor: (@message, @functionName, @argumentName, @intendedType, @actualValue, @numArguments) -> super message @name = "ArgumentError" if Error.captureStackTrace? Error.captureStackTrace @, @constructor toString: -> s = "#{@functionName}" if @argumentName is "return" s += "'s return value" else if @argumentName is "_excess" s += " takes only #{@numArguments} argument#{if @numArguments > 1 then 's' else ''}." else if @argumentName s += "'s argument #{@argumentName}" else s += " takes no arguments." actualType = typeof @actualValue if not @actualValue? actualType = 'null' else if _.isArray @actualValue actualType = 'array' typeMismatch = @intendedType and not @intendedType.match actualType if typeMismatch v = "" if actualType is 'string' v = "\"#{@actualValue}\"" else if actualType is "number" if Math.round(@actualValue) is @actualValue then @actualValue else @actualValue.toFixed(2) else if actualType is "boolean" v = "#{@actualValue}" else if (@actualValue? and @actualValue.id and @actualValue.trackedPropertiesKeys) # (Don't import Thang, but determine whether it is Thang.) v = @actualValue.toString() else if @actualValue instanceof Vector v = @actualValue.toString() showValue = showValue or @actualValue instanceof Vector s += " should have type #{@intendedType}, but got #{actualType}#{if v then ': ' + v else ''}." else if @argumentName and @argumentName isnt "_excess" s += " has a problem." s += '\n' + @message if @message s