Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 25 additions & 9 deletions internal/cli/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,18 +235,34 @@ func addSoulFieldFlags(cmd *cobra.Command) {
f.String("license", "", "SPDX license id (overrides frontmatter)")
}

// applySoulFieldFlags copies every explicitly set field flag over fields —
// flags always beat frontmatter.
func applySoulFieldFlags(cmd *cobra.Command, fields map[string]any) error {
for _, pair := range soulFieldFlagMap {
if !cmd.Flags().Changed(pair[0]) {
continue
}
v, err := cmd.Flags().GetString(pair[0])
// applyStringFieldFlags copies the mapped string flags into fields. When
// omitEmpty is true (create) only non-empty values are sent, so empty optionals
// fall through to the server defaults; when false (update) every explicitly set
// flag is sent, so an explicit empty value clears that field. The mapping is an
// ordered slice so the wire body stays deterministic.
func applyStringFieldFlags(cmd *cobra.Command, mapping [][2]string, fields map[string]any, omitEmpty bool) error {
for _, pair := range mapping {
flag, key := pair[0], pair[1]
v, err := cmd.Flags().GetString(flag)
if err != nil {
return err
}
fields[pair[1]] = v
if omitEmpty {
if v != "" {
fields[key] = v
}
} else if cmd.Flags().Changed(flag) {
fields[key] = v
}
}
return nil
}

// applySoulFieldFlags copies every explicitly set field flag over fields —
// flags always beat frontmatter.
func applySoulFieldFlags(cmd *cobra.Command, fields map[string]any) error {
if err := applyStringFieldFlags(cmd, soulFieldFlagMap, fields, false); err != nil {
return err
}
if cmd.Flags().Changed("framework") {
v, err := cmd.Flags().GetStringArray("framework")
Expand Down
16 changes: 1 addition & 15 deletions internal/cli/feed.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,21 +84,7 @@ func addFeedFieldFlags(cmd *cobra.Command) {
// applies its defaults); on update only the flags explicitly set are sent, so
// an explicit empty --author/--listing clears that attribution.
func applyFeedStringFlags(cmd *cobra.Command, fields map[string]any, forCreate bool) error {
for _, pair := range feedStringFlagMap {
flag, key := pair[0], pair[1]
v, err := cmd.Flags().GetString(flag)
if err != nil {
return err
}
if forCreate {
if v != "" {
fields[key] = v
}
} else if cmd.Flags().Changed(flag) {
fields[key] = v
}
}
return nil
return applyStringFieldFlags(cmd, feedStringFlagMap, fields, forCreate)
}

// applyFeedTagsFlag copies --tag into defaultTags when explicitly set.
Expand Down
11 changes: 2 additions & 9 deletions internal/cli/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,8 @@ func addPostFieldFlags(cmd *cobra.Command) {
// applyPostFieldFlags copies every explicitly set field flag over fields —
// flags always beat frontmatter.
func applyPostFieldFlags(cmd *cobra.Command, fields map[string]any) error {
for _, pair := range postFieldFlagMap {
if !cmd.Flags().Changed(pair[0]) {
continue
}
v, err := cmd.Flags().GetString(pair[0])
if err != nil {
return err
}
fields[pair[1]] = v
if err := applyStringFieldFlags(cmd, postFieldFlagMap, fields, false); err != nil {
return err
}
if cmd.Flags().Changed("tag") {
v, err := cmd.Flags().GetStringArray("tag")
Expand Down
12 changes: 3 additions & 9 deletions internal/cli/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,16 @@ func newProfileCreateCmd() *cobra.Command {
// omitted so the server applies its defaults (e.g. the GitHub avatar) and
// never sees an empty string where it expects a URL. An ordered slice (not
// a map) keeps the wire body deterministic, like soulFieldFlagMap.
for _, fk := range [][2]string{
if err := applyStringFieldFlags(cmd, [][2]string{
{"handle", "handle"},
{"name", "name"},
{"kind", "kind"},
{"avatar-url", "avatarUrl"},
{"github-url", "githubUrl"},
{"website", "website"},
{"bio", "bio"},
} {
v, gerr := cmd.Flags().GetString(fk[0])
if gerr != nil {
return gerr
}
if v != "" {
fields[fk[1]] = v
}
}, fields, true); err != nil {
return err
}
// Bools are always sent (false is meaningful); granting a seal is opt-in.
verified, gerr := cmd.Flags().GetBool("verified")
Expand Down
Loading