Skip to content

Commit

Permalink
feat: add struct names before the struct value
Browse files Browse the repository at this point in the history
  • Loading branch information
vpakhuchyi committed Oct 20, 2023
1 parent af60824 commit 5ca3b9a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 15 deletions.
3 changes: 1 addition & 2 deletions internal/formatters/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ const masked = "[******]"
// - pointer - pointed structure/arrays/slices are formatted recursively.
func FormatStruct(s models.Struct) string {
var buf strings.Builder
buf.WriteString("{")
buf.WriteString(fmt.Sprintf("%s{", s.Name))

fields := s.Fields

for i := 0; i < len(s.Fields); i++ {
f := fields[i]

Expand Down
1 change: 1 addition & 0 deletions internal/models/struct.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package models

type Struct struct {
Name string
Fields []Field
}
17 changes: 15 additions & 2 deletions internal/parsers/struct.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package parsers

import (
"fmt"
"reflect"
"strings"

"github.com/vpakhuchyi/sanitiser/internal/models"
"github.com/vpakhuchyi/sanitiser/internal/options"
Expand All @@ -10,9 +12,8 @@ import (
// ParseStruct parses a given value and returns a Struct.
// All fields of pointer/slice/array/struct types will be parsed recursively.
func ParseStruct(structValue reflect.Value) models.Struct {
var s models.Struct
var v models.Value

s := models.Struct{Name: getStructName(structValue)}
for i := 0; i < structValue.NumField(); i++ {
field := structValue.Field(i)

Expand Down Expand Up @@ -40,3 +41,15 @@ func ParseStruct(structValue reflect.Value) models.Struct {

return s
}

func getStructName(structValue reflect.Value) string {
t := structValue.Type()
pkg := strings.Split(t.PkgPath(), "/")

// If the package is the main package, then the path will be an empty string.
if len(pkg) == 1 && pkg[0] == "" {
return t.Name()
}

return fmt.Sprintf("%s.%s", pkg[len(pkg)-1], t.Name())
}
22 changes: 11 additions & 11 deletions sanitiser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func Test_sanitizedStruct(t *testing.T) {
Float32: 1.389,
String: "string",
},
exp: `{"Int64": -53645354, "Int32": -346456, "Int16": -23452, "Int8": -101, "Int": -456345655, "Uint64": 53645354, "Uint32": 346456, "Uint16": 23452, "Uint8": 101, "Uint": 456345655, "Bool": true, "Rune": 97, "Byte": 1, "Float64": 1.12341, "Float32": 1.389, "String": "string"}`,
exp: `sanitiser.structWithPrimitives{"Int64": -53645354, "Int32": -346456, "Int16": -23452, "Int8": -101, "Int": -456345655, "Uint64": 53645354, "Uint32": 346456, "Uint16": 23452, "Uint8": 101, "Uint": 456345655, "Bool": true, "Rune": 97, "Byte": 1, "Float64": 1.12341, "Float32": 1.389, "String": "string"}`,
},
"struct_with_complex_fields": {
val: structWithComplexFields{
Expand All @@ -105,7 +105,7 @@ func Test_sanitizedStruct(t *testing.T) {
Ptr: &address{City: "San Francisco", State: "CA", Street: "451 Main St", Zip: "55501"},
Struct: address{City: "San Francisco", State: "CA", Street: "451 Main St", Zip: "55501"},
},
exp: `{"Slice": [{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, {"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "MaskedSlice": "[******]", "Array": [{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, {"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "Ptr": &{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, "Struct": {"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}}`,
exp: `sanitiser.structWithComplexFields{"Slice": [sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "MaskedSlice": "[******]", "Array": [sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "Ptr": &sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, "Struct": sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}}`,
},
"struct_with_containers_fields": {
val: structWithContainersFields{
Expand All @@ -116,7 +116,7 @@ func Test_sanitizedStruct(t *testing.T) {
StructSlice: []address{{City: "San Francisco", State: "CA", Street: "451 Main St", Zip: "55501"}, {City: "Denver", State: "DN", Street: "65 Best St", Zip: "55502"}},
PointerSlice: []*int{new(int), new(int)},
ArraySlice: [2]string{"tag1", "tag2"}},
exp: `{"StringSlice": ["tag1", "tag2"], "IntSlice": [1, 2, 3], "FloatSlice": [1.1, 2.2, 3.30022], "BoolSlice": [true, false], "StructSlice": [{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, {"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "PointerSlice": [&0, &0], "ArraySlice": ["tag1", "tag2"]}`,
exp: `sanitiser.structWithContainersFields{"StringSlice": ["tag1", "tag2"], "IntSlice": [1, 2, 3], "FloatSlice": [1.1, 2.2, 3.30022], "BoolSlice": [true, false], "StructSlice": [sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}], "PointerSlice": [&0, &0], "ArraySlice": ["tag1", "tag2"]}`,
},
"empty_struct": {
val: struct{}{},
Expand All @@ -142,14 +142,14 @@ func Test_sanitizedSlice(t *testing.T) {
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
{Street: "65 Best St", City: "Denver", State: "DN", Zip: "55502"},
},
exp: `[&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, &{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
exp: `[&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, &sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
},
"slice_of_structs": {
val: []address{
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
{Street: "65 Best St", City: "Denver", State: "DN", Zip: "55502"},
},
exp: `[{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, {"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
exp: `[sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
},
"slices_of_strings": {
val: []string{"tag1", "tag2"},
Expand All @@ -172,7 +172,7 @@ func Test_sanitizedSlice(t *testing.T) {
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
nil,
},
exp: `[&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, nil]`,
exp: `[&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, nil]`,
},
"empty_slice": {
val: []string{},
Expand Down Expand Up @@ -202,14 +202,14 @@ func Test_sanitizedArray(t *testing.T) {
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
{Street: "65 Best St", City: "Denver", State: "DN", Zip: "55502"},
},
exp: `[&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, &{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
exp: `[&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, &sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
},
"array_of_structs": {
val: [2]address{
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
{Street: "65 Best St", City: "Denver", State: "DN", Zip: "55502"},
},
exp: `[{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, {"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
exp: `[sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, sanitiser.address{"City": "Denver", "State": "DN", "Street": "[******]", "Zip": "[******]"}]`,
},
"array_of_strings": {
val: [2]string{"tag1", "tag2"},
Expand All @@ -236,7 +236,7 @@ func Test_sanitizedArray(t *testing.T) {
{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
nil,
},
exp: `[&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, nil]`,
exp: `[&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}, nil]`,
},
"empty_slice": {
val: [0]string{},
Expand Down Expand Up @@ -267,7 +267,7 @@ func Test_sanitizedPointer(t *testing.T) {
}{
"pointer_to_struct": {
val: &address{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"},
exp: `&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}`,
exp: `&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}`,
},
"nil_pointer": {
val: (*address)(nil),
Expand Down Expand Up @@ -309,7 +309,7 @@ func Test_sanitizedPointer(t *testing.T) {
a := &address{Street: "451 Main St", City: "San Francisco", State: "CA", Zip: "55501"}
return &a
}(),
exp: `&&{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}`,
exp: `&&sanitiser.address{"City": "San Francisco", "State": "CA", "Street": "[******]", "Zip": "[******]"}`,
},
"pointer_to_pointer_to_slice": {
val: func() **[]string {
Expand Down

0 comments on commit 5ca3b9a

Please sign in to comment.