Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
String c = (String) replacementChar;
Map<String, Object> o = new HashMap<>();
o.put("char", c);
o.put("replacement", "'" + specialCharReplacements.get(c));
o.put("replacement", specialCharReplacements.get(c));
replacements.add(o);
}
additionalProperties.put("specialCharReplacements", replacements);
Expand Down Expand Up @@ -636,29 +636,6 @@ private String makeQueryListType(String type, String collectionFormat) {
}
}

private String fixOperatorChars(String string) {
StringBuilder sb = new StringBuilder();
String name = string;
//Check if it is a reserved word, in which case the underscore is added when property name is generated.
if (string.startsWith("_")) {
if (reservedWords.contains(string.substring(1))) {
name = string.substring(1);
} else if (reservedWordsMappings.containsValue(string)) {
name = LEADING_UNDERSCORE.matcher(string).replaceFirst("");
}
}
for (char c : name.toCharArray()) {
String cString = String.valueOf(c);
if (specialCharReplacements.containsKey(cString)) {
sb.append("'");
sb.append(specialCharReplacements.get(cString));
} else {
sb.append(c);
}
}
return sb.toString();
}

// Remove characters from a string that do not belong in a model classname
private String fixModelChars(String string) {
return string.replace(".", "").replace("-", "");
Expand All @@ -680,7 +657,7 @@ public CodegenModel fromModel(String name, Schema mod) {
// From the model name, compute the prefix for the fields.
String prefix = camelize(model.classname, LOWERCASE_FIRST_LETTER);
for (CodegenProperty prop : model.vars) {
prop.name = toVarName(prefix + camelize(fixOperatorChars(prop.name)));
prop.name = toVarName(prefix + camelize(prop.name));
}

// Create newtypes for things with non-object types
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
String c = (String) replacementChar;
Map<String, Object> o = new HashMap<>();
o.put("char", c);
o.put("replacement", "'" + specialCharReplacements.get(c));
o.put("replacement", specialCharReplacements.get(c));
replacements.add(o);
}
additionalProperties.put("specialCharReplacements", replacements);
Expand Down Expand Up @@ -530,29 +530,6 @@ private String getParameterTestValue(CodegenParameter codegenParameter) {
}
}

private String fixOperatorChars(String string) {
StringBuilder sb = new StringBuilder();
String name = string;
//Check if it is a reserved word, in which case the underscore is added when property name is generated.
if (string.startsWith("_")) {
if (reservedWords.contains(string.substring(1))) {
name = string.substring(1);
} else if (reservedWordsMappings.containsValue(string)) {
name = LEADING_UNDERSCORE.matcher(string).replaceFirst("");
}
}
for (char c : name.toCharArray()) {
String cString = String.valueOf(c);
if (specialCharReplacements.containsKey(cString)) {
sb.append("'");
sb.append(specialCharReplacements.get(cString));
} else {
sb.append(c);
}
}
return sb.toString();
}

// Remove characters from a string that do not belong in a model classname
private String fixModelChars(String string) {
return string.replace(".", "").replace("-", "");
Expand All @@ -574,7 +551,7 @@ public CodegenModel fromModel(String name, Schema mod) {
// From the model name, compute the prefix for the fields.
String prefix = camelize(model.classname, LOWERCASE_FIRST_LETTER);
for (CodegenProperty prop : model.vars) {
prop.name = toVarName(prefix + camelize(fixOperatorChars(prop.name)));
prop.name = toVarName(prefix + camelize(prop.name));
}

// Create newtypes for things with non-object types
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ import Data.Function ((&))
} deriving (Show, Eq, Generic, Data)

instance FromJSON {{classname}} where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "{{vendorExtensions.x-prefix}}")
parseJSON = genericParseJSON (removeFieldLabelPrefix "{{vendorExtensions.x-prefix}}")
instance ToJSON {{classname}} where
toJSON = genericToJSON (removeFieldLabelPrefix False "{{vendorExtensions.x-prefix}}")
toJSON = genericToJSON (removeFieldLabelPrefix "{{vendorExtensions.x-prefix}}")
{{#generateToSchema}}
instance ToSchema {{classname}} where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "{{vendorExtensions.x-prefix}}"
$ removeFieldLabelPrefix "{{vendorExtensions.x-prefix}}"
{{/generateToSchema}}

{{/parent}}
Expand All @@ -70,24 +70,16 @@ uncapitalize [] = []

-- | Remove a field label prefix during JSON parsing.
-- Also perform any replacements for special characters.
-- The @forParsing@ parameter is to distinguish between the cases in which we're using this
-- to power a @FromJSON@ or a @ToJSON@ instance. In the first case we're parsing, and we want
-- to replace special characters with their quoted equivalents (because we cannot have special
-- chars in identifier names), while we want to do vice versa when sending data instead.
removeFieldLabelPrefix :: Bool -> String -> Options
removeFieldLabelPrefix forParsing prefix =
removeFieldLabelPrefix :: String -> Options
removeFieldLabelPrefix prefix =
defaultOptions
{ omitNothingFields = True
, fieldLabelModifier = uncapitalize . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix . replaceSpecialChars
, fieldLabelModifier = uncapitalize . replaceSpecialChars . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix
}
where
replaceSpecialChars field = foldl (&) field (map mkCharReplacement specialChars)
specialChars =
[ {{#specialCharReplacements}}("{{&char}}", "{{&replacement}}"){{^-last}}
, {{/-last}}{{/specialCharReplacements}}
]
mkCharReplacement (replaceStr, searchStr) = T.unpack . replacer (T.pack searchStr) (T.pack replaceStr) . T.pack
replacer =
if forParsing
then flip T.replace
else T.replace
mkCharReplacement (replaceStr, searchStr) = T.unpack . T.replace (T.pack searchStr) (T.pack replaceStr) . T.pack
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ import Data.Function ((&))
} deriving (Show, Eq, Generic)

instance FromJSON {{classname}} where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "{{vendorExtensions.x-prefix}}")
parseJSON = genericParseJSON (removeFieldLabelPrefix "{{vendorExtensions.x-prefix}}")
instance ToJSON {{classname}} where
toJSON = genericToJSON (removeFieldLabelPrefix False "{{vendorExtensions.x-prefix}}")
toJSON = genericToJSON (removeFieldLabelPrefix "{{vendorExtensions.x-prefix}}")

{{/parent}}
{{#parent}}
Expand All @@ -58,24 +58,16 @@ uncapitalize [] = []

-- | Remove a field label prefix during JSON parsing.
-- Also perform any replacements for special characters.
-- The @forParsing@ parameter is to distinguish between the cases in which we're using this
-- to power a @FromJSON@ or a @ToJSON@ instance. In the first case we're parsing, and we want
-- to replace special characters with their quoted equivalents (because we cannot have special
-- chars in identifier names), while we want to do vice versa when sending data instead.
removeFieldLabelPrefix :: Bool -> String -> Options
removeFieldLabelPrefix forParsing prefix =
removeFieldLabelPrefix :: String -> Options
removeFieldLabelPrefix prefix =
defaultOptions
{ omitNothingFields = True
, fieldLabelModifier = uncapitalize . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix . replaceSpecialChars
, fieldLabelModifier = uncapitalize . replaceSpecialChars . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix
}
where
replaceSpecialChars field = foldl (&) field (map mkCharReplacement specialChars)
specialChars =
[ {{#specialCharReplacements}}("{{&char}}", "{{&replacement}}"){{^-last}}
, {{/-last}}{{/specialCharReplacements}}
]
mkCharReplacement (replaceStr, searchStr) = T.unpack . replacer (T.pack searchStr) (T.pack replaceStr) . T.pack
replacer =
if forParsing
then flip T.replace
else T.replace
mkCharReplacement (replaceStr, searchStr) = T.unpack . T.replace (T.pack searchStr) (T.pack replaceStr) . T.pack
126 changes: 59 additions & 67 deletions samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ data ApiResponse = ApiResponse
} deriving (Show, Eq, Generic, Data)

instance FromJSON ApiResponse where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "apiResponse")
parseJSON = genericParseJSON (removeFieldLabelPrefix "apiResponse")
instance ToJSON ApiResponse where
toJSON = genericToJSON (removeFieldLabelPrefix False "apiResponse")
toJSON = genericToJSON (removeFieldLabelPrefix "apiResponse")
instance ToSchema ApiResponse where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "apiResponse"
$ removeFieldLabelPrefix "apiResponse"


-- | A category for a pet
Expand All @@ -54,13 +54,13 @@ data Category = Category
} deriving (Show, Eq, Generic, Data)

instance FromJSON Category where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "category")
parseJSON = genericParseJSON (removeFieldLabelPrefix "category")
instance ToJSON Category where
toJSON = genericToJSON (removeFieldLabelPrefix False "category")
toJSON = genericToJSON (removeFieldLabelPrefix "category")
instance ToSchema Category where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "category"
$ removeFieldLabelPrefix "category"


-- | An order for a pets from the pet store
Expand All @@ -74,13 +74,13 @@ data Order = Order
} deriving (Show, Eq, Generic, Data)

instance FromJSON Order where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "order")
parseJSON = genericParseJSON (removeFieldLabelPrefix "order")
instance ToJSON Order where
toJSON = genericToJSON (removeFieldLabelPrefix False "order")
toJSON = genericToJSON (removeFieldLabelPrefix "order")
instance ToSchema Order where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "order"
$ removeFieldLabelPrefix "order"


-- | A pet for sale in the pet store
Expand All @@ -94,13 +94,13 @@ data Pet = Pet
} deriving (Show, Eq, Generic, Data)

instance FromJSON Pet where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "pet")
parseJSON = genericParseJSON (removeFieldLabelPrefix "pet")
instance ToJSON Pet where
toJSON = genericToJSON (removeFieldLabelPrefix False "pet")
toJSON = genericToJSON (removeFieldLabelPrefix "pet")
instance ToSchema Pet where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "pet"
$ removeFieldLabelPrefix "pet"


-- | A tag for a pet
Expand All @@ -110,13 +110,13 @@ data Tag = Tag
} deriving (Show, Eq, Generic, Data)

instance FromJSON Tag where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "tag")
parseJSON = genericParseJSON (removeFieldLabelPrefix "tag")
instance ToJSON Tag where
toJSON = genericToJSON (removeFieldLabelPrefix False "tag")
toJSON = genericToJSON (removeFieldLabelPrefix "tag")
instance ToSchema Tag where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "tag"
$ removeFieldLabelPrefix "tag"


-- | A User who is purchasing from the pet store
Expand All @@ -132,13 +132,13 @@ data User = User
} deriving (Show, Eq, Generic, Data)

instance FromJSON User where
parseJSON = genericParseJSON (removeFieldLabelPrefix True "user")
parseJSON = genericParseJSON (removeFieldLabelPrefix "user")
instance ToJSON User where
toJSON = genericToJSON (removeFieldLabelPrefix False "user")
toJSON = genericToJSON (removeFieldLabelPrefix "user")
instance ToSchema User where
declareNamedSchema = Swagger.genericDeclareNamedSchema
$ Swagger.fromAesonOptions
$ removeFieldLabelPrefix False "user"
$ removeFieldLabelPrefix "user"


uncapitalize :: String -> String
Expand All @@ -147,59 +147,51 @@ uncapitalize [] = []

-- | Remove a field label prefix during JSON parsing.
-- Also perform any replacements for special characters.
-- The @forParsing@ parameter is to distinguish between the cases in which we're using this
-- to power a @FromJSON@ or a @ToJSON@ instance. In the first case we're parsing, and we want
-- to replace special characters with their quoted equivalents (because we cannot have special
-- chars in identifier names), while we want to do vice versa when sending data instead.
removeFieldLabelPrefix :: Bool -> String -> Options
removeFieldLabelPrefix forParsing prefix =
removeFieldLabelPrefix :: String -> Options
removeFieldLabelPrefix prefix =
defaultOptions
{ omitNothingFields = True
, fieldLabelModifier = uncapitalize . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix . replaceSpecialChars
, fieldLabelModifier = uncapitalize . replaceSpecialChars . fromMaybe (error ("did not find prefix " ++ prefix)) . stripPrefix prefix
}
where
replaceSpecialChars field = foldl (&) field (map mkCharReplacement specialChars)
specialChars =
[ ("$", "'Dollar")
, ("^", "'Caret")
, ("|", "'Pipe")
, ("=", "'Equal")
, ("*", "'Star")
, ("-", "'Dash")
, ("&", "'Ampersand")
, ("%", "'Percent")
, ("#", "'Hash")
, ("@", "'At")
, ("!", "'Exclamation")
, ("+", "'Plus")
, (":", "'Colon")
, (";", "'Semicolon")
, (">", "'GreaterThan")
, ("<", "'LessThan")
, (".", "'Period")
, ("_", "'Underscore")
, ("?", "'Question_Mark")
, (",", "'Comma")
, ("'", "'Quote")
, ("/", "'Slash")
, ("(", "'Left_Parenthesis")
, (")", "'Right_Parenthesis")
, ("{", "'Left_Curly_Bracket")
, ("}", "'Right_Curly_Bracket")
, ("[", "'Left_Square_Bracket")
, ("]", "'Right_Square_Bracket")
, ("~", "'Tilde")
, ("`", "'Backtick")
, ("<=", "'Less_Than_Or_Equal_To")
, (">=", "'Greater_Than_Or_Equal_To")
, ("!=", "'Not_Equal")
, ("<>", "'Not_Equal")
, ("~=", "'Tilde_Equal")
, ("\\", "'Back_Slash")
, ("\"", "'Double_Quote")
[ ("$", "Dollar")
, ("^", "Caret")
, ("|", "Pipe")
, ("=", "Equal")
, ("*", "Star")
, ("-", "Dash")
, ("&", "Ampersand")
, ("%", "Percent")
, ("#", "Hash")
, ("@", "At")
, ("!", "Exclamation")
, ("+", "Plus")
, (":", "Colon")
, (";", "Semicolon")
, (">", "GreaterThan")
, ("<", "LessThan")
, (".", "Period")
, ("_", "Underscore")
, ("?", "Question_Mark")
, (",", "Comma")
, ("'", "Quote")
, ("/", "Slash")
, ("(", "Left_Parenthesis")
, (")", "Right_Parenthesis")
, ("{", "Left_Curly_Bracket")
, ("}", "Right_Curly_Bracket")
, ("[", "Left_Square_Bracket")
, ("]", "Right_Square_Bracket")
, ("~", "Tilde")
, ("`", "Backtick")
, ("<=", "Less_Than_Or_Equal_To")
, (">=", "Greater_Than_Or_Equal_To")
, ("!=", "Not_Equal")
, ("<>", "Not_Equal")
, ("~=", "Tilde_Equal")
, ("\\", "Back_Slash")
, ("\"", "Double_Quote")
]
mkCharReplacement (replaceStr, searchStr) = T.unpack . replacer (T.pack searchStr) (T.pack replaceStr) . T.pack
replacer =
if forParsing
then flip T.replace
else T.replace
mkCharReplacement (replaceStr, searchStr) = T.unpack . T.replace (T.pack searchStr) (T.pack replaceStr) . T.pack
Loading