@@ -2,14 +2,13 @@ package jsonschema
22
33import (
44 "bytes"
5- "encoding/json"
65 "errors"
76 "fmt"
87 "os"
98 "strings"
109
11- "github.com/iancoleman/orderedmap"
1210 "github.com/jesseduffield/lazycore/pkg/utils"
11+ "github.com/karimkhaleel/jsonschema"
1312 "github.com/samber/lo"
1413
1514 "gopkg.in/yaml.v3"
@@ -106,16 +105,7 @@ func (n *Node) MarshalYAML() (interface{}, error) {
106105 setComment (& keyNode , n .Description )
107106 }
108107
109- if n .Default != nil {
110- valueNode := yaml.Node {
111- Kind : yaml .ScalarNode ,
112- }
113- err := valueNode .Encode (n .Default )
114- if err != nil {
115- return nil , err
116- }
117- node .Content = append (node .Content , & keyNode , & valueNode )
118- } else if len (n .Children ) > 0 {
108+ if len (n .Children ) > 0 {
119109 childrenNode := yaml.Node {
120110 Kind : yaml .MappingNode ,
121111 }
@@ -136,60 +126,18 @@ func (n *Node) MarshalYAML() (interface{}, error) {
136126 childrenNode .Content = append (childrenNode .Content , childYaml .(* yaml.Node ).Content ... )
137127 }
138128 node .Content = append (node .Content , & keyNode , & childrenNode )
139- }
140-
141- return & node , nil
142- }
143-
144- func getDescription (v * orderedmap.OrderedMap ) string {
145- description , ok := v .Get ("description" )
146- if ! ok {
147- description = ""
148- }
149- return description .(string )
150- }
151-
152- func getDefault (v * orderedmap.OrderedMap ) (error , any ) {
153- defaultValue , ok := v .Get ("default" )
154- if ok {
155- return nil , defaultValue
156- }
157-
158- dataType , ok := v .Get ("type" )
159- if ok {
160- dataTypeString := dataType .(string )
161- if dataTypeString == "string" {
162- return nil , ""
129+ } else {
130+ valueNode := yaml.Node {
131+ Kind : yaml .ScalarNode ,
163132 }
133+ err := valueNode .Encode (n .Default )
134+ if err != nil {
135+ return nil , err
136+ }
137+ node .Content = append (node .Content , & keyNode , & valueNode )
164138 }
165139
166- return errors .New ("Failed to get default value" ), nil
167- }
168-
169- func parseNode (parent * Node , name string , value * orderedmap.OrderedMap ) {
170- description := getDescription (value )
171- err , defaultValue := getDefault (value )
172- if err == nil {
173- leaf := & Node {Name : name , Description : description , Default : defaultValue }
174- parent .Children = append (parent .Children , leaf )
175- }
176-
177- properties , ok := value .Get ("properties" )
178- if ! ok {
179- return
180- }
181-
182- orderedProperties := properties .(orderedmap.OrderedMap )
183-
184- node := & Node {Name : name , Description : description }
185- parent .Children = append (parent .Children , node )
186-
187- keys := orderedProperties .Keys ()
188- for _ , name := range keys {
189- value , _ := orderedProperties .Get (name )
190- typedValue := value .(orderedmap.OrderedMap )
191- parseNode (node , name , & typedValue )
192- }
140+ return & node , nil
193141}
194142
195143func writeToConfigDocs (config []byte ) error {
@@ -222,31 +170,12 @@ func writeToConfigDocs(config []byte) error {
222170 return nil
223171}
224172
225- func GenerateConfigDocs () {
226- content , err := os .ReadFile (GetSchemaDir () + "/config.json" )
227- if err != nil {
228- panic ("Error reading config.json" )
173+ func GenerateConfigDocs (schema * jsonschema.Schema ) {
174+ rootNode := & Node {
175+ Children : make ([]* Node , 0 ),
229176 }
230177
231- schema := orderedmap .New ()
232-
233- err = json .Unmarshal (content , & schema )
234- if err != nil {
235- panic ("Failed to unmarshal config.json" )
236- }
237-
238- root , ok := schema .Get ("properties" )
239- if ! ok {
240- panic ("properties key not found in schema" )
241- }
242- orderedRoot := root .(orderedmap.OrderedMap )
243-
244- rootNode := Node {}
245- for _ , name := range orderedRoot .Keys () {
246- value , _ := orderedRoot .Get (name )
247- typedValue := value .(orderedmap.OrderedMap )
248- parseNode (& rootNode , name , & typedValue )
249- }
178+ recurseOverSchema (schema , schema .Definitions ["UserConfig" ], rootNode )
250179
251180 var buffer bytes.Buffer
252181 encoder := yaml .NewEncoder (& buffer )
@@ -262,8 +191,51 @@ func GenerateConfigDocs() {
262191
263192 config := prepareMarshalledConfig (buffer )
264193
265- err = writeToConfigDocs (config )
194+ err : = writeToConfigDocs (config )
266195 if err != nil {
267196 panic (err )
268197 }
269198}
199+
200+ func recurseOverSchema (rootSchema , schema * jsonschema.Schema , parent * Node ) {
201+ if schema == nil || schema .Properties == nil || schema .Properties .Len () == 0 {
202+ return
203+ }
204+
205+ for pair := schema .Properties .Oldest (); pair != nil ; pair = pair .Next () {
206+ subSchema := getSubSchema (rootSchema , schema , pair .Key )
207+
208+ // Skip empty objects
209+ if subSchema .Type == "object" && subSchema .Properties == nil {
210+ continue
211+ }
212+
213+ // Skip empty arrays
214+ if isZeroValue (subSchema .Default ) && subSchema .Type == "array" {
215+ continue
216+ }
217+
218+ node := Node {
219+ Name : pair .Key ,
220+ Description : subSchema .Description ,
221+ Default : getZeroValue (subSchema .Default , subSchema .Type ),
222+ }
223+ parent .Children = append (parent .Children , & node )
224+ recurseOverSchema (rootSchema , subSchema , & node )
225+ }
226+ }
227+
228+ func getZeroValue (val any , t string ) any {
229+ if ! isZeroValue (val ) {
230+ return val
231+ }
232+
233+ switch t {
234+ case "string" :
235+ return ""
236+ case "boolean" :
237+ return false
238+ default :
239+ return nil
240+ }
241+ }
0 commit comments