Skip to content

Commit

Permalink
fix some more invalid character bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
marhaupe committed Sep 29, 2022
1 parent 8c69f69 commit aef7f30
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 49 deletions.
28 changes: 13 additions & 15 deletions pkg/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,21 +250,20 @@ func mergeObjects(children []*parse.ObjectNode) *parse.ObjectNode {

var caser = cases.Title(language.English)

func makeVarname(varname string) *jen.Statement {
upperCaseVarname := caser.String(strings.ToLower(varname))

// Maybe we can find a shortcut? This is getting a bit computation heavy
if isValid, validIdentifier := identifierIsValid(varname); !isValid {
upperCaseVarname = validIdentifier
fmt.Println("Invalid identifier found. We cleaned that up for you, but you might want to double check if you're happy with our naming: ", validIdentifier)
func makeVarname(key string) *jen.Statement {
varname := strings.ToLower(key)
varname = caser.String(varname)
validVarname := stripInvalidCharacters(varname)
if validVarname != varname {
fmt.Printf("invalid identifier %v, renamed to %s:\n", key, validVarname)
}

if identifierIsPredeclared(varname) {
upperCaseVarname = "_" + upperCaseVarname
fmt.Println("Predeclared identifier found. We cleaned that up for you, but you might want to double check if you're happy with our naming: ", upperCaseVarname)
if identifierIsPredeclared(validVarname) {
validVarname = "_" + validVarname
fmt.Printf("predeclared identifier %v, renamed to %s:\n", key, validVarname)
}

return jen.Id(upperCaseVarname)
return jen.Id(validVarname)
}

// Valid identifiers are specified here: https://go.dev/ref/spec#Identifiers.
Expand All @@ -273,18 +272,17 @@ func makeVarname(varname string) *jen.Statement {
// letter = unicode_letter | "_" .
// unicode_letter = /* a Unicode code point classified as "Letter" */ .
// unicode_digit = /* a Unicode code point classified as "Number, decimal digit" */ .
func identifierIsValid(identifier string) (bool, string) {
func stripInvalidCharacters(identifier string) string {
characters := []rune(identifier)
if !isLetter(characters[0]) {
characters[0] = '_'
}
for i, char := range characters[1:] {
if !(isLetter(char) || unicode.IsDigit(char)) {
characters[i] = '_'
characters[i+1] = '_'
}
}
validIdentifier := string(characters)
return validIdentifier == identifier, validIdentifier
return string(characters)
}

func isLetter(letter rune) bool {
Expand Down
64 changes: 34 additions & 30 deletions pkg/generator/generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,56 +15,60 @@ func Test_identifierIsValid(t *testing.T) {
varname string
}
tests := []struct {
name string
args args
wantIsValid bool
wantCleanedIdentifier string
name string
args args
wantedCleanedIdentifier string
}{
{
name: "floating",
args: args{"1.1"},
wantIsValid: false,
name: "floating",
args: args{"1.1"},
wantedCleanedIdentifier: "__1",
},
{
name: "negative floating",
args: args{"-1.1"},
wantIsValid: false,
name: "negative floating",
args: args{"-1.1"},
wantedCleanedIdentifier: "_1_1",
},
{
name: "int",
args: args{"1"},
wantIsValid: false,
name: "int",
args: args{"1"},
wantedCleanedIdentifier: "_",
},
{
name: "negative int",
args: args{"-1"},
wantIsValid: false,
name: "negative int",
args: args{"-1"},
wantedCleanedIdentifier: "_1",
},
{
name: "$",
args: args{"$test"},
wantIsValid: false,
name: "leading $",
args: args{"$test"},
wantedCleanedIdentifier: "_test",
},
{
name: "only letters",
args: args{"xyz"},
wantIsValid: true,
name: "only letters",
args: args{"xyz"},
wantedCleanedIdentifier: "xyz",
},
{
name: "underscore",
args: args{"_test"},
wantIsValid: true,
name: "underscore",
args: args{"_test"},
wantedCleanedIdentifier: "_test",
},
{
name: "invalid character in the middle",
args: args{"_$test"},
wantIsValid: true,
name: "invalid character in the middle",
args: args{"__test"},
wantedCleanedIdentifier: "__test",
},
{
name: "-",
args: args{"content-type"},
wantedCleanedIdentifier: "content_type",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got, _ := identifierIsValid(tt.args.varname); got != tt.wantIsValid {
t.Errorf("identifierIsValid() = %v, want %v", got, tt.wantIsValid)
if got := stripInvalidCharacters(tt.args.varname); got != tt.wantedCleanedIdentifier {
t.Errorf("stripInvalidCharacters() = %v, want %v", got, tt.wantedCleanedIdentifier)
}
})
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"contentType": "application/vnd.microsoft.card.adaptive",
"content-type": "application/vnd.microsoft.card.adaptive",
"content": {
"type": "AdaptiveCard",
"body": [
Expand All @@ -23,4 +23,4 @@
]
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package generated

type JSONToStruct struct {
Content struct {
_schema string `json:"$schema"`
_Schema string `json:"$schema"`
Body []struct {
Text string `json:"text"`
Type string `json:"type"`
Expand All @@ -20,5 +20,5 @@ type JSONToStruct struct {
Type string `json:"type"`
Version string `json:"version"`
} `json:"content"`
Contenttype string `json:"contentType"`
Content_Type string `json:"content-type"`
}

0 comments on commit aef7f30

Please sign in to comment.