diff --git a/cmd/schema/main.go b/cmd/schema/main.go index 352d1586..33896672 100644 --- a/cmd/schema/main.go +++ b/cmd/schema/main.go @@ -8,8 +8,8 @@ import ( "github.com/bmeg/grip/gripql" "github.com/bmeg/grip/log" "github.com/bmeg/grip/schema" - graphSchema "github.com/bmeg/grip/schema" "github.com/bmeg/grip/util/rpc" + "github.com/bmeg/jsonschemagraph/schconv" "github.com/spf13/cobra" ) @@ -18,6 +18,7 @@ var yaml = false var jsonFile string var yamlFile string var graphName string +var writeSchema bool = false var jsonSchemaFile string var yamlSchemaDir string var sampleCount uint32 = 50 @@ -44,16 +45,16 @@ var getCmd = &cobra.Command{ return err } - schema, err := conn.GetSchema(graph) + gripqlschema, err := conn.GetSchema(graph) if err != nil { return err } var txt string if yaml { - txt, err = graphSchema.GraphToYAMLString(schema) + txt, err = schema.GraphToYAMLString(gripqlschema) } else { - txt, err = graphSchema.GraphToJSONString(schema) + txt, err = schema.GraphToJSONString(gripqlschema) } if err != nil { return err @@ -80,7 +81,7 @@ var loadGqlSchemafromJsonSchema = &cobra.Command{ if jsonSchemaFile != "" && graphName != "" { log.Infof("Loading Json Schema file: %s", jsonSchemaFile) - graphs, err := schema.ParseJSONSchemaGraphsFile(jsonSchemaFile, graphName) + graphs, err := schconv.ParseGraphFile(jsonSchemaFile, "jsonSchema", graphName) if err != nil { return err } @@ -94,19 +95,21 @@ var loadGqlSchemafromJsonSchema = &cobra.Command{ } if yamlSchemaDir != "" && graphName != "" { log.Infof("Loading Yaml Schema dir: %s", yamlSchemaDir) - graphs, err := schema.ParseYAMLSchemaGraphsFiles(yamlSchemaDir, graphName) + graphs, err := schconv.ParseGraphFile(yamlSchemaDir, "yamlSchema", graphName) if err != nil { log.Info("HELLO ERROR HERE: ", err) return err } for _, g := range graphs { - err := conn.AddSchema(g) + + _ = schema.GripGraphqltoGraphql(g, writeSchema) + //fmt.Println(graphql_string) + err = conn.AddSchema(g) if err != nil { return err } log.Debug("Posted schema: %s", g.Graph) } - } return nil }, @@ -135,9 +138,9 @@ var postCmd = &cobra.Command{ if err != nil { return err } - graphs, err = graphSchema.ParseJSONGraphs(bytes) + graphs, err = schema.ParseJSONGraphs(bytes) } else { - graphs, err = graphSchema.ParseJSONGraphsFile(jsonFile) + graphs, err = schema.ParseJSONGraphsFile(jsonFile) } if err != nil { return err @@ -159,9 +162,9 @@ var postCmd = &cobra.Command{ if err != nil { return err } - graphs, err = graphSchema.ParseYAMLGraphs(bytes) + graphs, err = schema.ParseYAMLGraphs(bytes) } else { - graphs, err = graphSchema.ParseYAMLGraphsFile(yamlFile) + graphs, err = schema.ParseYAMLGraphsFile(yamlFile) } if err != nil { return err @@ -204,6 +207,7 @@ func init() { pflags.StringVar(&graphName, "graphName", "", "Name of schemaGraph") gqlflags := loadGqlSchemafromJsonSchema.Flags() + gqlflags.BoolVar(&writeSchema, "writeSchema", writeSchema, "Write graphql schema to disk") gqlflags.StringVar(&host, "host", host, "grip server url") gqlflags.StringVar(&jsonSchemaFile, "jsonSchema", "", "Json Schema") gqlflags.StringVar(&yamlSchemaDir, "yamlSchemaDir", "", "Name of YAML schemas dir") diff --git a/go.mod b/go.mod index cf980b0d..9cfd30f8 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 github.com/bmeg/jsonpath v0.0.0-20210207014051-cca5355553ad github.com/bmeg/jsonschema/v5 v5.3.4-0.20241111204732-55db82022a92 - github.com/bmeg/jsonschemagraph v0.0.3-0.20241130225037-5545ec0ffd4b + github.com/bmeg/jsonschemagraph v0.0.3-0.20241210002603-05a78a1c9530 github.com/boltdb/bolt v1.3.1 github.com/casbin/casbin/v2 v2.97.0 github.com/cockroachdb/pebble v1.1.1 @@ -44,12 +44,12 @@ require ( github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.0 go.mongodb.org/mongo-driver v1.11.9 - golang.org/x/crypto v0.25.0 - golang.org/x/net v0.27.0 - golang.org/x/sync v0.7.0 + golang.org/x/crypto v0.27.0 + golang.org/x/net v0.29.0 + golang.org/x/sync v0.8.0 google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.2 + google.golang.org/protobuf v1.35.2 sigs.k8s.io/yaml v1.4.0 ) @@ -126,9 +126,9 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240424034433-3c2c7870ae76 // indirect golang.org/x/exp v0.0.0-20240707233637-46b078467d37 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/term v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/term v0.24.0 // indirect + golang.org/x/text v0.19.0 // indirect gonum.org/v1/gonum v0.8.2 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect diff --git a/go.sum b/go.sum index dba87e31..47882f89 100644 --- a/go.sum +++ b/go.sum @@ -35,12 +35,12 @@ github.com/bmeg/jsonpath v0.0.0-20210207014051-cca5355553ad h1:ICgBexeLB7iv/IQz4 github.com/bmeg/jsonpath v0.0.0-20210207014051-cca5355553ad/go.mod h1:ft96Irkp72C7ZrUWRenG7LrF0NKMxXdRvsypo5Njhm4= github.com/bmeg/jsonschema/v5 v5.3.4-0.20241111204732-55db82022a92 h1:Myx/j+WxfEg+P3nDaizR1hBpjKSLgvr4ydzgp1/1pAU= github.com/bmeg/jsonschema/v5 v5.3.4-0.20241111204732-55db82022a92/go.mod h1:6v27bSBKXyIDFqlKQbUSnHlekE1y6bDkgWCuVEaDPng= -github.com/bmeg/jsonschemagraph v0.0.3-0.20241113190142-5e57a1561020 h1:7/dWlBDJdKYhtF31LO8zXcw/IcYsmp/MWpydk6PzuNA= -github.com/bmeg/jsonschemagraph v0.0.3-0.20241113190142-5e57a1561020/go.mod h1:k04v50661tQFKgYl6drQxWGf9q0dBmKhd6lwIk1rcCw= -github.com/bmeg/jsonschemagraph v0.0.3-0.20241130214835-4863185c5c72 h1:p8LS6V7vX/Hq+cJl8WvEQZjN2X+xjIXQTuQkstgfG6I= -github.com/bmeg/jsonschemagraph v0.0.3-0.20241130214835-4863185c5c72/go.mod h1:k04v50661tQFKgYl6drQxWGf9q0dBmKhd6lwIk1rcCw= github.com/bmeg/jsonschemagraph v0.0.3-0.20241130225037-5545ec0ffd4b h1:k9j0qId2gRBwYhSdvqlBfQQDNIU4nohG4J9lu9crWE0= github.com/bmeg/jsonschemagraph v0.0.3-0.20241130225037-5545ec0ffd4b/go.mod h1:k04v50661tQFKgYl6drQxWGf9q0dBmKhd6lwIk1rcCw= +github.com/bmeg/jsonschemagraph v0.0.3-0.20241209230926-fb19ad7b2e2a h1:DStPPpLlDhbFx4lRDhuQg0/SKah+DoJV48bHSuTZeIs= +github.com/bmeg/jsonschemagraph v0.0.3-0.20241209230926-fb19ad7b2e2a/go.mod h1:uVS5AJySmP/VVuZF5Ux/tVyPWNi9IWP5ZRf3il70F7k= +github.com/bmeg/jsonschemagraph v0.0.3-0.20241210002603-05a78a1c9530 h1:2TwiDqHDaL2Myb791dxjaE7qSVDmSXjOkEyIXlphR38= +github.com/bmeg/jsonschemagraph v0.0.3-0.20241210002603-05a78a1c9530/go.mod h1:uVS5AJySmP/VVuZF5Ux/tVyPWNi9IWP5ZRf3il70F7k= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -338,6 +338,8 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= @@ -417,8 +419,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -453,8 +455,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -464,8 +466,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -499,16 +501,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -519,8 +521,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -571,8 +573,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/schema/graph.go b/schema/graph.go index 1ecfccef..59a7db7e 100644 --- a/schema/graph.go +++ b/schema/graph.go @@ -6,152 +6,14 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "github.com/bmeg/grip/log" - "slices" - "github.com/bmeg/grip/gripql" - "github.com/bmeg/jsonschema/v5" - "github.com/bmeg/jsonschemagraph/compile" - "github.com/bmeg/jsonschemagraph/graph" "google.golang.org/protobuf/encoding/protojson" "sigs.k8s.io/yaml" ) -func ConvertToGripqlType(field string) string { - switch field { - case "string": - return gripql.FieldType_STRING.String() - case "integer": - return gripql.FieldType_NUMERIC.String() - case "number": - return gripql.FieldType_NUMERIC.String() - case "boolean": - return gripql.FieldType_BOOL.String() - default: - return gripql.FieldType_UNKNOWN.String() - } -} - -func ParseSchema(schema *jsonschema.Schema) any { - /* This function traverses through the compiled json schema constructing a simplified - schema that consists of only golang primitive types */ - - //log.Infof("ENTERING FLATTEN SCHEMA %#v\n", schema) - vertData := make(map[string]any) - if schema.Ref != nil && schema.Ref.Title != "" { - // Primitive extensions are currently not supported. - if slices.Contains([]string{"Reference", "Link", "FHIRPrimitiveExtension"}, schema.Ref.Title) { - return nil - } - return ParseSchema(schema.Ref) - } - if schema.Items2020 != nil { - if schema.Items2020.Ref != nil && - schema.Items2020.Ref.Title != "" && - slices.Contains([]string{"Reference", "Link", "Link Description Object", "FHIRPrimitiveExtension"}, schema.Items2020.Ref.Title) { - return nil - } - if schema.Types[0] == "array" { - return []any{ParseSchema(schema.Items2020)} - } - return ParseSchema(schema.Items2020) - } - - if len(schema.Properties) > 0 { - for key, property := range schema.Properties { - // Not going to support inifinite nested extensions even though FHIR does. - if key == "extension" || key == "modifierExtension" { - continue - } - if val := ParseSchema(property); val != nil { - vertData[key] = val - } - } - return vertData - } - if schema.AnyOf != nil { - return nil - /* fhir_comments not implemented - for _, val := range schema.AnyOf { - return ParseSchema(val) - }*/ - } - if schema.Types != nil { - return ConvertToGripqlType(schema.Types[0]) - } - return nil -} - -func ParseIntoGraphqlSchema(relpath string, graphName string) ([]*gripql.Graph, error) { - out, err := graph.Load(relpath) - if err != nil { - log.Info("AN ERROR HAS OCCURED: ", err) - return nil, err - } - graphSchema := map[string]any{ - "vertices": []map[string]any{}, - "edges": []map[string]any{}, - "graph": graphName, - } - edgeList := []map[string]any{} - for _, class := range out.Classes { - // Since reading from schema there should be no duplicate edges - if ext, ok := class.Extensions[compile.GraphExtensionTag]; ok { - for _, target := range ext.(compile.GraphExtension).Targets { - ToVertex := strings.Split(target.Rel, "_") - edgeList = append(edgeList, map[string]any{ - "gid": fmt.Sprintf("(%s)-%s->(%s)", class.Title, target.Rel, ToVertex[len(ToVertex)-1]), - "label": target.Rel, - "from": class.Title, - "to": ToVertex[len(ToVertex)-1], - // TODO: No data field supported - }) - } - } - vertexData := make(map[string]any) - for key, sch := range class.Properties { - if sch.Ref != nil && sch.Ref.Title != "" && slices.Contains([]string{"Reference", "Link", "FHIRPrimitiveExtension"}, sch.Ref.Title) { - continue - } - vertVal := ParseSchema(sch) - //log.Info("FLATTENED VALUES: ", flattened_values) - switch vertVal.(type) { - case string: - vertexData[key] = vertVal.(string) - case int: - vertexData[key] = vertVal.(int) - case map[string]any: - vertexData[key] = vertVal.(map[string]any) - case []any: - vertexData[key] = vertVal.([]any) - } - } - vertex := map[string]any{"data": vertexData, "label": "Vertex", "gid": class.Title} - graphSchema["vertices"] = append(graphSchema["vertices"].([]map[string]any), vertex) - graphSchema["edges"] = edgeList - - } - - expandedJSON, err := json.Marshal(graphSchema) - if err != nil { - log.Errorf("Failed to marshal expanded schema: %v", err) - } - /* - For Testing purposes - err = os.WriteFile("new_dicts.json", expandedJSON, 0644) - if err != nil { - log.Errorf("Failed to write to file: %v", err) - } - */ - - graphs := gripql.Graph{} - json.Unmarshal(expandedJSON, &graphs) - return []*gripql.Graph{&graphs}, nil -} - func ParseYAMLSchemaGraphs(source []byte, graphName string) ([]*gripql.Graph, error) { return nil, nil } @@ -281,10 +143,6 @@ func parseGraphFile(relpath string, format string, graphName string) ([]*gripql. graphs, err = ParseYAMLGraphs(source) case "json": graphs, err = ParseJSONGraphs(source) - case "jsonSchema": - graphs, err = ParseIntoGraphqlSchema(path, graphName) - case "yamlSchema": - graphs, err = ParseIntoGraphqlSchema(relpath, graphName) case "jSchema": file, err := os.Open(path) if err != nil { @@ -351,14 +209,6 @@ func ParseJSONGraphsFile(relpath string) ([]*gripql.Graph, error) { return parseGraphFile(relpath, "json", "") } -func ParseJSONSchemaGraphsFile(relpath string, graphName string) ([]*gripql.Graph, error) { - return parseGraphFile(relpath, "jsonSchema", graphName) -} - -func ParseYAMLSchemaGraphsFiles(relpath string, graphName string) ([]*gripql.Graph, error) { - return parseGraphFile(relpath, "jsonSchema", graphName) -} - func ParseJsonSchema(relpath string, graphName string) ([]*gripql.Graph, error) { return parseGraphFile(relpath, "jSchema", graphName) } diff --git a/schema/graphql.go b/schema/graphql.go new file mode 100644 index 00000000..77363403 --- /dev/null +++ b/schema/graphql.go @@ -0,0 +1,38 @@ +package schema + +import ( + "fmt" + "os" + "strings" + + "github.com/bmeg/grip/gripql" +) + +func GripGraphqltoGraphql(graph *gripql.Graph, writefile bool) string { + var schemaBuilder strings.Builder + for _, v := range graph.Vertices { + if strings.HasSuffix(v.Gid, "Type") { + for name, values := range v.Data.AsMap() { + schemaBuilder.WriteString(fmt.Sprintf("enum %s {\n", name)) + for _, value := range values.([]any) { + schemaBuilder.WriteString(fmt.Sprintf(" %s\n", value)) + } + schemaBuilder.WriteString("}\n\n") + } + } else { + schemaBuilder.WriteString(fmt.Sprintf("type %s {\n", v.Gid)) + for field, fieldType := range v.Data.AsMap() { + schemaBuilder.WriteString(fmt.Sprintf(" %s: %s\n", field, fieldType)) + } + schemaBuilder.WriteString("}\n") + } + } + if writefile { + fileName := "schema.graphql" + err := os.WriteFile(fileName, []byte(schemaBuilder.String()), 0644) + if err != nil { + fmt.Printf("Failed to write schema to file: %v\n", err) + } + } + return schemaBuilder.String() +}