// copying demonstrates optional Go-to-Go conversion and checked deep copying. package main import ( "errors" "fmt" "log" "time" "git.yuntuo.hk/k2safe/go-omni/copyx" ) type Input struct { Name string Enabled bool Tags []string CreatedAt time.Time } type View struct { DisplayName string Enabled bool Tags []string CreatedAt string } func run() error { converter, err := copyx.New( copyx.WithDeepCopy(), copyx.WithFieldNames[Input, View](map[string]string{"Name": "DisplayName"}), copyx.WithConverter(func(v time.Time) (string, error) { return v.UTC().Format(time.RFC3339), nil }), ) if err != nil { return err } source := Input{Name: "sample", Enabled: false, Tags: []string{"original"}, CreatedAt: time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)} var target View if err = converter.Copy(&target, source); err != nil { return err } target.Tags[0] = "changed" fmt.Printf("name=%s enabled=%t time=%s sourceTag=%s\n", target.DisplayName, target.Enabled, target.CreatedAt, source.Tags[0]) cloned, err := copyx.Clone(source) if err != nil { return err } cloned.Tags[0] = "separate" fmt.Println("clone detached:", source.Tags[0] == "original") _, err = copyx.Clone(source.Tags, copyx.WithConverter(func(v []string) ([]string, error) { return v, nil })) fmt.Println("shared converter rejected:", errors.Is(err, copyx.ErrSharedReference)) if !errors.Is(err, copyx.ErrSharedReference) { return errors.New("expected alias rejection") } return nil } func main() { if err := run(); err != nil { log.Fatal(err) } }