Ompluscator / dynamic-struct

Golang package for editing struct's fields during runtime and mapping structs to other structs.
MIT License
683 stars 81 forks source link

Expose anonymous/embedded struct member. #30

Open infogulch opened 11 months ago

infogulch commented 11 months ago

I see that last year support for embedded structs was added, but it doesn't enable the builder to create a type with embedded structs.

Something like this:

    type stitle struct{ Title string }
    type stext struct{ Text string }

    dstruct := dynamicstruct.NewStruct().
        AddField("", stitle{}, ``).
        AddField("", stext{}, ``).
        Build().
        New()

    type compare struct {
        stitle
        stext 
    }

    if dstruct != compare{} {
        fmt.Println("expected equal")
    }

Besides the general idea of creating a new struct, do you think this is a reasonable interface? In particular if name == "", then set anonymous: true.

infogulch commented 8 months ago

Well it seems reflect cannot represent unexported embedded struct members:

https://go.dev/play/p/C7P38xkmjka?v=gotip

But it seems to work fine as long as the member structs are public:

https://go.dev/play/p/V0OchLN74bU?v=gotip

infogulch commented 8 months ago

I've marked #31 as draft because I found a bug in the reflect package that causes issues with embedded fields.

https://github.com/golang/go/issues/65144

infogulch commented 7 months ago

Bugfix by ianlancetaylor: https://go-review.googlesource.com/c/go/+/567897