Skip to content

gekatateam/mappath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mappath

mappath is a simple package for searching and modifying generic maps (map[string]any) or slices ([]any) using keypaths.

This functionality was originally implemented in Neptunus to navigate through event data.

Examples

rawJson := `
{
    "message": "user login",
    "metadata": {
        "user": {
            "name": "John Doe",
            "email": "johndoe@gmail.com",
            "roles": [ "employee", "manager" ],
            "age": 42
        }
    }
}
`

var data any
if err := json.Unmarshal([]byte(rawJson), &data); err != nil {
    return err
}

// get first user role
role, _ := mappath.Get(data, "metadata.user.roles.0")

// add login to user metadata
data, _ = mappath.Put(data, "metadata.user.login", "johndoe12")

// delete user second role
data, _ = mappath.Delete(data, "metadata.user.roles.1")

It may be not so conveniently, when function returns nil data if error occured. For this cases, use Container:

rawJson := `
{
    "message": "user login",
    "metadata": {
        "user": {
            "name": "John Doe",
            "email": "johndoe@gmail.com",
            "roles": [ "employee", "manager" ],
            "age": 42
        }
    }
}
`

c := &mappath.Container{}
if err := json.Unmarshal([]byte(rawJson), &c.Data); err != nil {
    return err
}

// get first user role
role, err := c.Get("metadata.user.roles.0")

// add login to user metadata
err = c.Put("metadata.user.login", "johndoe12")

// delete user second role
err = c.Delete("metadata.user.roles.1")

Container stores data and updates it only if change operations have been performed successfully.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages