1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "extensions/renderer/bindings/api_invocation_errors.h"
6 
7 #include <vector>
8 
9 #include "base/strings/string_util.h"
10 #include "base/strings/stringprintf.h"
11 
12 namespace extensions {
13 namespace api_errors {
14 
15 const char kTypeString[] = "string";
16 const char kTypeDouble[] = "number";
17 const char kTypeBoolean[] = "boolean";
18 const char kTypeInteger[] = "integer";
19 const char kTypeObject[] = "object";
20 const char kTypeList[] = "array";
21 const char kTypeBinary[] = "binary";
22 const char kTypeFunction[] = "function";
23 const char kTypeUndefined[] = "undefined";
24 const char kTypeNull[] = "null";
25 const char kTypeAny[] = "any";
26 
InvalidEnumValue(const std::set<std::string> & valid_enums)27 std::string InvalidEnumValue(const std::set<std::string>& valid_enums) {
28   std::vector<base::StringPiece> options(valid_enums.begin(),
29                                          valid_enums.end());
30   std::string options_str = base::JoinString(options, ", ");
31   return base::StringPrintf("Value must be one of %s.", options_str.c_str());
32 }
33 
MissingRequiredProperty(const char * property_name)34 std::string MissingRequiredProperty(const char* property_name) {
35   return base::StringPrintf("Missing required property '%s'.", property_name);
36 }
37 
UnexpectedProperty(const char * property_name)38 std::string UnexpectedProperty(const char* property_name) {
39   return base::StringPrintf("Unexpected property: '%s'.", property_name);
40 }
41 
TooFewArrayItems(int minimum,int found)42 std::string TooFewArrayItems(int minimum, int found) {
43   return base::StringPrintf("Array must have at least %d items; found %d.",
44                             minimum, found);
45 }
46 
TooManyArrayItems(int maximum,int found)47 std::string TooManyArrayItems(int maximum, int found) {
48   return base::StringPrintf("Array must have at most %d items; found %d.",
49                             maximum, found);
50 }
51 
TooFewStringChars(int minimum,int found)52 std::string TooFewStringChars(int minimum, int found) {
53   return base::StringPrintf(
54       "String must have at least %d characters; found %d.", minimum, found);
55 }
56 
TooManyStringChars(int maximum,int found)57 std::string TooManyStringChars(int maximum, int found) {
58   return base::StringPrintf("String must have at most %d characters; found %d.",
59                             maximum, found);
60 }
61 
NumberTooSmall(int minimum)62 std::string NumberTooSmall(int minimum) {
63   return base::StringPrintf("Value must be at least %d.", minimum);
64 }
65 
NumberTooLarge(int maximum)66 std::string NumberTooLarge(int maximum) {
67   return base::StringPrintf("Value must be at most %d.", maximum);
68 }
69 
InvalidType(const char * expected_type,const char * actual_type)70 std::string InvalidType(const char* expected_type, const char* actual_type) {
71   return base::StringPrintf("Invalid type: expected %s, found %s.",
72                             expected_type, actual_type);
73 }
74 
NotAnInstance(const char * instance_type)75 std::string NotAnInstance(const char* instance_type) {
76   return base::StringPrintf("Value must be an instance of %s.", instance_type);
77 }
78 
InvalidChoice()79 std::string InvalidChoice() {
80   return "Value did not match any choice.";
81 }
82 
UnserializableValue()83 std::string UnserializableValue() {
84   return "Value is unserializable.";
85 }
86 
ScriptThrewError()87 std::string ScriptThrewError() {
88   return "Script threw an error.";
89 }
90 
TooManyArguments()91 std::string TooManyArguments() {
92   return "Too many arguments.";
93 }
94 
NoMatchingSignature()95 std::string NoMatchingSignature() {
96   return "No matching signature.";
97 }
98 
MissingRequiredArgument(const char * argument_name)99 std::string MissingRequiredArgument(const char* argument_name) {
100   return base::StringPrintf("Missing required argument '%s'.", argument_name);
101 }
102 
IndexError(uint32_t index,const std::string & error)103 std::string IndexError(uint32_t index, const std::string& error) {
104   return base::StringPrintf("Error at index %u: %s", index, error.c_str());
105 }
106 
PropertyError(const char * property_name,const std::string & error)107 std::string PropertyError(const char* property_name, const std::string& error) {
108   return base::StringPrintf("Error at property '%s': %s", property_name,
109                             error.c_str());
110 }
111 
ArgumentError(const std::string & parameter_name,const std::string & error)112 std::string ArgumentError(const std::string& parameter_name,
113                           const std::string& error) {
114   return base::StringPrintf("Error at parameter '%s': %s",
115                             parameter_name.c_str(), error.c_str());
116 }
117 
InvocationError(const std::string & method_name,const std::string & expected_signature,const std::string & error)118 std::string InvocationError(const std::string& method_name,
119                             const std::string& expected_signature,
120                             const std::string& error) {
121   return base::StringPrintf("Error in invocation of %s(%s): %s",
122                             method_name.c_str(), expected_signature.c_str(),
123                             error.c_str());
124 }
125 
126 }  // namespace api_errors
127 }  // namespace extensions
128