| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Routines used to validate and normalize arguments. | 5 // Routines used to validate and normalize arguments. |
| 6 // TODO(benwells): unit test this file. | 6 // TODO(benwells): unit test this file. |
| 7 | 7 |
| 8 var JSONSchemaValidator = require('json_schema').JSONSchemaValidator; | 8 var JSONSchemaValidator = require('json_schema').JSONSchemaValidator; |
| 9 | 9 |
| 10 var schemaValidator = new JSONSchemaValidator(); | 10 var schemaValidator = new JSONSchemaValidator(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 parameterSchemas[i].name + ") is required."); | 37 parameterSchemas[i].name + ") is required."); |
| 38 } | 38 } |
| 39 } | 39 } |
| 40 } | 40 } |
| 41 | 41 |
| 42 // Generate all possible signatures for a given API function. | 42 // Generate all possible signatures for a given API function. |
| 43 function getSignatures(parameterSchemas) { | 43 function getSignatures(parameterSchemas) { |
| 44 if (parameterSchemas.length === 0) | 44 if (parameterSchemas.length === 0) |
| 45 return [[]]; | 45 return [[]]; |
| 46 var signatures = []; | 46 var signatures = []; |
| 47 var remaining = getSignatures(parameterSchemas.slice(1)); | 47 var remaining = getSignatures($Array.slice(parameterSchemas, 1)); |
| 48 for (var i = 0; i < remaining.length; i++) | 48 for (var i = 0; i < remaining.length; i++) |
| 49 signatures.push([parameterSchemas[0]].concat(remaining[i])) | 49 $Array.push(signatures, $Array.concat([parameterSchemas[0]], remaining[i])) |
| 50 if (parameterSchemas[0].optional) | 50 if (parameterSchemas[0].optional) |
| 51 return signatures.concat(remaining); | 51 return $Array.concat(signatures, remaining); |
| 52 return signatures; | 52 return signatures; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 // Return true if arguments match a given signature's schema. | 55 // Return true if arguments match a given signature's schema. |
| 56 function argumentsMatchSignature(args, candidateSignature) { | 56 function argumentsMatchSignature(args, candidateSignature) { |
| 57 if (args.length != candidateSignature.length) | 57 if (args.length != candidateSignature.length) |
| 58 return false; | 58 return false; |
| 59 for (var i = 0; i < candidateSignature.length; i++) { | 59 for (var i = 0; i < candidateSignature.length; i++) { |
| 60 var argType = JSONSchemaValidator.getType(args[i]); | 60 var argType = JSONSchemaValidator.getType(args[i]); |
| 61 if (!schemaValidator.isValidSchemaType(argType, | 61 if (!schemaValidator.isValidSchemaType(argType, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 if (!resolvedSignature) | 112 if (!resolvedSignature) |
| 113 throw new Error("Invocation of form " + | 113 throw new Error("Invocation of form " + |
| 114 getArgumentSignatureString(funDef.name, args) + | 114 getArgumentSignatureString(funDef.name, args) + |
| 115 " doesn't match definition " + | 115 " doesn't match definition " + |
| 116 getParameterSignatureString(funDef.name, definedSignature)); | 116 getParameterSignatureString(funDef.name, definedSignature)); |
| 117 validate(args, resolvedSignature); | 117 validate(args, resolvedSignature); |
| 118 var normalizedArgs = []; | 118 var normalizedArgs = []; |
| 119 var ai = 0; | 119 var ai = 0; |
| 120 for (var si = 0; si < definedSignature.length; si++) { | 120 for (var si = 0; si < definedSignature.length; si++) { |
| 121 if (definedSignature[si] === resolvedSignature[ai]) | 121 if (definedSignature[si] === resolvedSignature[ai]) |
| 122 normalizedArgs.push(args[ai++]); | 122 $Array.push(normalizedArgs, args[ai++]); |
| 123 else | 123 else |
| 124 normalizedArgs.push(null); | 124 $Array.push(normalizedArgs, null); |
| 125 } | 125 } |
| 126 return normalizedArgs; | 126 return normalizedArgs; |
| 127 }; | 127 }; |
| 128 | 128 |
| 129 // Validates that a given schema for an API function is not ambiguous. | 129 // Validates that a given schema for an API function is not ambiguous. |
| 130 function isFunctionSignatureAmbiguous(functionDef) { | 130 function isFunctionSignatureAmbiguous(functionDef) { |
| 131 if (functionDef.allowAmbiguousOptionalArguments) | 131 if (functionDef.allowAmbiguousOptionalArguments) |
| 132 return false; | 132 return false; |
| 133 var signaturesAmbiguous = function(signature1, signature2) { | 133 var signaturesAmbiguous = function(signature1, signature2) { |
| 134 if (signature1.length != signature2.length) | 134 if (signature1.length != signature2.length) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 147 return true; | 147 return true; |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 return false; | 150 return false; |
| 151 }; | 151 }; |
| 152 | 152 |
| 153 exports.isFunctionSignatureAmbiguous = isFunctionSignatureAmbiguous; | 153 exports.isFunctionSignatureAmbiguous = isFunctionSignatureAmbiguous; |
| 154 exports.normalizeArgumentsAndValidate = normalizeArgumentsAndValidate; | 154 exports.normalizeArgumentsAndValidate = normalizeArgumentsAndValidate; |
| 155 exports.schemaValidator = schemaValidator; | 155 exports.schemaValidator = schemaValidator; |
| 156 exports.validate = validate; | 156 exports.validate = validate; |
| OLD | NEW |