Skip to content

Repository files navigation

Structo 🏗️

Go library for struct serialization, diffing, change tracking, and default injection with nested struct, pointer, slice, and encoding support.


✨ Features

  • ✅ Encode/decode struct to string or binary
  • 🔄 Flatten dan unflatten nested struct
  • 📆 Inject default values to struct
  • 🕵️ Struct diffing and history tracking
  • ⟳ Copy between structs with different shapes

📦 Installations

go get github.com/Lucifer07/Structo

🚀 Example

Struct Sample

typeAddressstruct {
Citystring`json:"city"`ZipCodestring`json:"zipCode"`
}
typeMetadatastruct {
Activebool`json:"active"`Versionstring`json:"version"`
}
typeUserstruct {
IDintNamestringEmail*stringTags []stringMetadataMetadataAddress*Address
}

🔐 Encode & Decode

conv:=structo.NewConverter()
encoded:=conv.EncodeToString(user)
conv.DecodeFromString(encoded, &user)

🧱 Binary Encode & Decode

bin:=conv.StructToBinary(user)
conv.BinaryToStruct(bin, &user)

🔐 Safe Encode

encoded:=conv.EncodeToStringSafe(user)
conv.DecodeFromStringSafe(encoded, &user)

🧬 Flatten & Unflatten

flat:=structo.Flatten(user)
// map[string]any: {"Name":"Jane", "Address.City":"Jakarta", ...}varuUserstructo.Unflatten(flat, &u)

🗓️ Diff Struct

diff, _:=structo.Diff(oldUser, newUser)
forfield, values:=rangediff {
fmt.Printf("%s: %v -> %v\n", field, values[0], values[1])
}

📊 Track Changes (Add, Remove, Change)

changes, _:=structo.TrackWithHistory(oldUser, newUser)
forfield, res:=rangechanges {
switchres.Action {
casestructo.Add:
fmt.Printf("%s: appended %v\n", field, res.Data.GetData())
casestructo.Remove:
fmt.Printf("%s: removed %v\n", field, res.Data.GetData())
casestructo.Change:
data:=res.Data.GetData().([]any)
fmt.Printf("%s: changed from %v to %v\n", field, data[0], data[1])
}
}

⟳ Copy Struct to a Different Shape

varexternalExternalUserstructo.Copy(&external, user)

⚙️ Inject Default Values

typeProfilestruct {
Namestring`default:"Anonymous"`Ageint`default:"18"`Emailstring`default:"default@example.com"`
}
varpProfilestructo.InjectDefaults(&p)
// p.Name = "Anonymous", etc.

📁 Full Example

view the example/main.go file for full example, runnable example.


📜 Lisensi

MIT © Lucifer07


💡 Contributions

Contributions are welcome! Feel free to open issues and pull requests to improve Structo.


🔥 Enjoy fast and secure struct serialization with Structo!

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages