mirror of
https://github.com/charmbracelet/crush.git
synced 2025-08-02 05:20:46 +03:00
fix: simplify stuff
This commit is contained in:
2
.github/workflows/schema-update.yml
vendored
2
.github/workflows/schema-update.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
- run: go run . schema > .github/crush-schema.json
|
||||
- run: go run . schema > ./schema.json
|
||||
- uses: stefanzweifel/git-auto-commit-action@778341af668090896ca464160c2def5d1d1a3eb0 # v5
|
||||
with:
|
||||
commit_message: "chore: auto-update generated files"
|
||||
|
||||
@@ -3,7 +3,6 @@ package cmd
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"github.com/charmbracelet/crush/internal/config"
|
||||
"github.com/invopop/jsonschema"
|
||||
@@ -16,52 +15,12 @@ var schemaCmd = &cobra.Command{
|
||||
Long: "Generate JSON schema for the crush configuration file",
|
||||
Hidden: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
reflector := jsonschema.Reflector{
|
||||
// Custom type mapper to handle csync.Map
|
||||
Mapper: func(t reflect.Type) *jsonschema.Schema {
|
||||
// Handle csync.Map[string, ProviderConfig] specifically
|
||||
if t.String() == "csync.Map[string,github.com/charmbracelet/crush/internal/config.ProviderConfig]" {
|
||||
return &jsonschema.Schema{
|
||||
Type: "object",
|
||||
Description: "AI provider configurations",
|
||||
AdditionalProperties: &jsonschema.Schema{
|
||||
Ref: "#/$defs/ProviderConfig",
|
||||
},
|
||||
}
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
// First reflect the config to get the main schema
|
||||
schema := reflector.Reflect(&config.Config{})
|
||||
|
||||
// Now manually add the ProviderConfig definition that might be missing
|
||||
providerConfigSchema := reflector.ReflectFromType(reflect.TypeOf(config.ProviderConfig{}))
|
||||
if schema.Definitions == nil {
|
||||
schema.Definitions = make(map[string]*jsonschema.Schema)
|
||||
}
|
||||
|
||||
// Extract the actual definition from the nested schema
|
||||
if providerConfigSchema.Definitions != nil && providerConfigSchema.Definitions["ProviderConfig"] != nil {
|
||||
schema.Definitions["ProviderConfig"] = providerConfigSchema.Definitions["ProviderConfig"]
|
||||
// Also add any other definitions from the provider config schema
|
||||
for k, v := range providerConfigSchema.Definitions {
|
||||
if k != "ProviderConfig" {
|
||||
schema.Definitions[k] = v
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Fallback: use the schema itself if it's not nested
|
||||
schema.Definitions["ProviderConfig"] = providerConfigSchema
|
||||
}
|
||||
|
||||
schemaJSON, err := json.MarshalIndent(schema, "", " ")
|
||||
reflector := new(jsonschema.Reflector)
|
||||
bts, err := json.MarshalIndent(reflector.Reflect(&config.Config{}), "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal schema: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println(string(schemaJSON))
|
||||
fmt.Println(string(bts))
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
@@ -96,6 +96,11 @@ var (
|
||||
_ json.Marshaler = &Map[string, any]{}
|
||||
)
|
||||
|
||||
func (Map[K, V]) JSONSchemaAlias() any { //nolint
|
||||
m := map[K]V{}
|
||||
return m
|
||||
}
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaler.
|
||||
func (m *Map[K, V]) UnmarshalJSON(data []byte) error {
|
||||
m.mu.Lock()
|
||||
|
||||
Reference in New Issue
Block a user