mirror of
https://forge.liiib.re/indiehost/libre.sh/libre.sh.git
synced 2024-12-28 06:36:42 +00:00
refactor(cue): make GenerateConfig to be generic and more flexible
This commit is contained in:
parent
677fbbc3ce
commit
80c6f7c77b
9 changed files with 359 additions and 142 deletions
27
go.mod
27
go.mod
|
@ -1,9 +1,11 @@
|
|||
module libre.sh
|
||||
|
||||
go 1.21
|
||||
go 1.22
|
||||
|
||||
toolchain go1.22.6
|
||||
|
||||
require (
|
||||
cuelang.org/go v0.8.1
|
||||
cuelang.org/go v0.10.0
|
||||
github.com/Masterminds/semver/v3 v3.2.1
|
||||
github.com/Nerzal/gocloak/v13 v13.9.0
|
||||
github.com/PuerkitoBio/goquery v1.9.1
|
||||
|
@ -29,14 +31,14 @@ require (
|
|||
github.com/onsi/ginkgo/v2 v2.13.1
|
||||
github.com/onsi/gomega v1.30.0
|
||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.70.0
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/spf13/cobra v1.8.1
|
||||
github.com/stakater/IngressMonitorController/v2 v2.1.50
|
||||
github.com/stretchr/testify v1.9.0
|
||||
github.com/t2bot/matrix-media-repo v1.3.7
|
||||
github.com/tidwall/gjson v1.17.1
|
||||
github.com/tidwall/sjson v1.2.5
|
||||
github.com/zalando/postgres-operator v1.10.1
|
||||
golang.org/x/term v0.20.0
|
||||
golang.org/x/term v0.23.0
|
||||
google.golang.org/grpc v1.62.1
|
||||
google.golang.org/protobuf v1.33.0
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
|
@ -124,6 +126,7 @@ require (
|
|||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
|
||||
github.com/philhofer/fwd v1.1.2 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
|
@ -156,17 +159,17 @@ require (
|
|||
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.25.0 // indirect
|
||||
golang.org/x/crypto v0.23.0 // indirect
|
||||
golang.org/x/crypto v0.26.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f // indirect
|
||||
golang.org/x/net v0.25.0 // indirect
|
||||
golang.org/x/oauth2 v0.18.0 // indirect
|
||||
golang.org/x/sync v0.7.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/net v0.28.0 // indirect
|
||||
golang.org/x/oauth2 v0.22.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.23.0 // indirect
|
||||
golang.org/x/text v0.17.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
|
||||
google.golang.org/appengine v1.6.8 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect
|
||||
gopkg.in/evanphx/json-patch.v5 v5.6.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
|
|
68
go.sum
68
go.sum
|
@ -1,8 +1,8 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e h1:GwCVItFUPxwdsEYnlUcJ6PJxOjTeFFCKOh6QWg4oAzQ=
|
||||
cuelabs.dev/go/oci/ociregistry v0.0.0-20240314152124-224736b49f2e/go.mod h1:ApHceQLLwcOkCEXM1+DyCXTHEJhNGDpJ2kmV6axsx24=
|
||||
cuelang.org/go v0.8.1 h1:VFYsxIFSPY5KgSaH1jQ2GxHOrbu6Ga3kEI70yCZwnOg=
|
||||
cuelang.org/go v0.8.1/go.mod h1:CoDbYolfMms4BhWUlhD+t5ORnihR7wvjcfgyO9lL5FI=
|
||||
cuelabs.dev/go/oci/ociregistry v0.0.0-20240807094312-a32ad29eed79 h1:EceZITBGET3qHneD5xowSTY/YHbNybvMWGh62K2fG/M=
|
||||
cuelabs.dev/go/oci/ociregistry v0.0.0-20240807094312-a32ad29eed79/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg=
|
||||
cuelang.org/go v0.10.0 h1:Y1Pu4wwga5HkXfLFK1sWAYaSWIBdcsr5Cb5AWj2pOuE=
|
||||
cuelang.org/go v0.10.0/go.mod h1:HzlaqqqInHNiqE6slTP6+UtxT9hN6DAzgJgdbNxXvX8=
|
||||
forge.liiib.re/indiehost/libre.sh/gocloak/v13 v13.0.0-20240425212506-70ebeff5b5ab h1:RPn8J9qj8WUd00hrMHqe9ydZSZg2OgdDvyX70+2dQB4=
|
||||
forge.liiib.re/indiehost/libre.sh/gocloak/v13 v13.0.0-20240425212506-70ebeff5b5ab/go.mod h1:YYuDcXZ7K2zKECyVP7pPqjKxx2AzYSpKDj8d6GuyM10=
|
||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic=
|
||||
|
@ -67,7 +67,7 @@ github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065na
|
|||
github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
|
||||
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
|
||||
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
|
||||
|
@ -87,8 +87,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
|
|||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw=
|
||||
github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
|
||||
github.com/emicklei/proto v1.13.2 h1:z/etSFO3uyXeuEsVPzfl56WNgzcvIr42aQazXaQmFZY=
|
||||
github.com/emicklei/proto v1.13.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
|
||||
|
@ -160,8 +160,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
|
|||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
|
||||
|
@ -174,7 +172,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
|||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
|
@ -296,6 +293,8 @@ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2sz
|
|||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
|
||||
|
@ -330,8 +329,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
|
|||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8=
|
||||
github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/rogpeppe/go-internal v1.12.1-0.20240709150035-ccf4b4329d21 h1:igWZJluD8KtEtAgRyF4x6lqcxDry1ULztksMJh2mnQE=
|
||||
github.com/rogpeppe/go-internal v1.12.1-0.20240709150035-ccf4b4329d21/go.mod h1:RMRJLmBOqWacUkmJHRMiPKh1S1m3PA7Zh4W80/kWPpg=
|
||||
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/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
|
@ -357,8 +356,8 @@ github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnj
|
|||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
|
||||
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
|
||||
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
||||
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stakater/IngressMonitorController/v2 v2.1.50 h1:7NN/7edU+8VK7+V7NNVgjv5Y35zhRecQ8aTEcEvWGFg=
|
||||
|
@ -428,8 +427,8 @@ golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPh
|
|||
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
|
||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f h1:3CW0unweImhOzd5FmYuRsD4Y4oQFKZIjAnKbjV4WIrw=
|
||||
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
|
||||
|
@ -443,8 +442,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -460,11 +459,11 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
|
|||
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
|
||||
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
|
||||
golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
|
||||
golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
|
||||
golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
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=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -474,8 +473,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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -506,8 +505,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.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 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
|
||||
golang.org/x/sys v0.23.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-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
@ -515,18 +514,17 @@ golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuX
|
|||
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
|
||||
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
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.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
|
||||
golang.org/x/text v0.17.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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
@ -541,8 +539,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -551,8 +549,6 @@ gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw
|
|||
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
||||
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
|
@ -571,8 +567,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
|
|||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
|
|
@ -51,16 +51,15 @@ func (r *ElementReconciler) reconcileConfigMap(ctx context.Context, element *mat
|
|||
}
|
||||
}
|
||||
|
||||
previous := cm.Data["config.json"]
|
||||
config, err := cue.GenerateConfigJSON(elementConfigSchema, previous, map[string]interface{}{
|
||||
"_synapse": synapse,
|
||||
"_element": element,
|
||||
"_elementCall": elementCall,
|
||||
})
|
||||
config, _, err := cue.GenerateConfig(elementConfigSchema, cue.FromJSON(cm.Data["config.json"]), cue.ToJSON(),
|
||||
cue.WithValue("_synapse", synapse),
|
||||
cue.WithValue("_element", element),
|
||||
cue.WithValue("_elementCall", elementCall),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cm.Data["config.json"] = config
|
||||
cm.Data["config.json"] = string(config)
|
||||
|
||||
return controllerutil.SetControllerReference(element, &cm, r.Scheme())
|
||||
})
|
||||
|
|
|
@ -309,21 +309,20 @@ func (r *SynapseReconciler) reconcileMasSecret(ctx context.Context, synapse *mat
|
|||
oidcSecret = *resources.oidcClientSecret
|
||||
}
|
||||
|
||||
previous := string(secret.Data["generated.yaml"])
|
||||
config, err := lshcue.GenerateConfigYAML(masSchema, previous, map[string]interface{}{
|
||||
"_synapse": synapse,
|
||||
"_synapseSvcName": resources.svc.Name,
|
||||
"_synapseConfigYaml": string(resources.secret.Data["homeserver.yaml"]),
|
||||
"_postgres": pgSecret.Data,
|
||||
"_mailbox": mailboxSecret.Data,
|
||||
"_oidc": oidcSecret.Data,
|
||||
})
|
||||
config, _, err := lshcue.GenerateConfig(masSchema, lshcue.FromYAML(secret.Data["generated.yaml"]), lshcue.ToYAML(),
|
||||
lshcue.WithValue("_synapse", synapse),
|
||||
lshcue.WithValue("_synapseSvcName", resources.svc.Name),
|
||||
lshcue.WithValue("_synapseConfigYaml", string(resources.secret.Data["homeserver.yaml"])),
|
||||
lshcue.WithValue("_postgres", pgSecret.Data),
|
||||
lshcue.WithValue("_mailbox", mailboxSecret.Data),
|
||||
lshcue.WithValue("_oidc", oidcSecret.Data),
|
||||
)
|
||||
if err != nil {
|
||||
msg := errors.Details(err, nil)
|
||||
fmt.Printf("Validate Error:\n%s\n", msg)
|
||||
return err
|
||||
}
|
||||
secret.Data["generated.yaml"] = []byte(config)
|
||||
secret.Data["generated.yaml"] = config
|
||||
|
||||
return controllerutil.SetControllerReference(synapse, &secret, r.Scheme())
|
||||
})
|
||||
|
|
|
@ -110,20 +110,19 @@ func (r *SynapseReconciler) reconcileSecret(ctx context.Context, synapse *matrix
|
|||
}
|
||||
}
|
||||
|
||||
previous := string(secret.Data["homeserver.yaml"])
|
||||
config, err := cue.GenerateConfigYAML(synaseConfigSchema, previous, map[string]interface{}{
|
||||
"_synapse": synapse,
|
||||
"_postgres": pgSecret.Data,
|
||||
"_redis": redisSecret.Data,
|
||||
"_mailbox": mailboxSecret.Data,
|
||||
"_oidc": oidcSecret.Data,
|
||||
"_elements": elements,
|
||||
"_elementCalls": elementCalls,
|
||||
})
|
||||
config, _, err := cue.GenerateConfig(synaseConfigSchema, cue.FromYAML(secret.Data["homeserver.yaml"]), cue.ToYAML(),
|
||||
cue.WithValue("_synapse", synapse),
|
||||
cue.WithValue("_postgres", pgSecret.Data),
|
||||
cue.WithValue("_redis", redisSecret.Data),
|
||||
cue.WithValue("_mailbox", mailboxSecret.Data),
|
||||
cue.WithValue("_oidc", oidcSecret.Data),
|
||||
cue.WithValue("_elements", elements),
|
||||
cue.WithValue("_elementCalls", elementCalls),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
secret.Data["homeserver.yaml"] = []byte(config)
|
||||
secret.Data["homeserver.yaml"] = config
|
||||
|
||||
// web_client_location
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ import (
|
|||
_ "embed"
|
||||
|
||||
"cuelang.org/go/cue"
|
||||
"cuelang.org/go/cue/cuecontext"
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
@ -45,10 +44,7 @@ func (r *SynapseReconciler) reconcileWellKnownConfigMap(ctx context.Context, syn
|
|||
cm.Data = make(map[string]string)
|
||||
}
|
||||
|
||||
ctx := cuecontext.New()
|
||||
value, err := lshcue.GenerateConfig(ctx, wellKnownConfigSchema, ctx.CompileString(""), map[string]interface{}{
|
||||
"_synapse": synapse,
|
||||
})
|
||||
_, value, err := lshcue.GenerateConfig(wellKnownConfigSchema, lshcue.WithValue("_synapse", synapse))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -21,8 +21,6 @@ import (
|
|||
_ "embed"
|
||||
|
||||
"cuelang.org/go/cue"
|
||||
"cuelang.org/go/cue/cuecontext"
|
||||
"cuelang.org/go/encoding/yaml"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||
|
||||
|
@ -30,7 +28,7 @@ import (
|
|||
|
||||
lshmeta "libre.sh/api/meta/v1alpha1"
|
||||
voipv1alpha1 "libre.sh/api/voip/v1alpha1"
|
||||
internalcue "libre.sh/internal/cue"
|
||||
lshcue "libre.sh/internal/cue"
|
||||
lshr "libre.sh/pkg/controller-runtime"
|
||||
)
|
||||
|
||||
|
@ -55,25 +53,12 @@ func (r *LiveKitServerReconciler) reconcileSecret(ctx context.Context, lkServer
|
|||
return err
|
||||
}
|
||||
|
||||
ctx := cuecontext.New()
|
||||
previous := string(secret.Data["server.yaml"])
|
||||
previousAST, err := yaml.Extract("", previous)
|
||||
value, cueValue, err := lshcue.GenerateConfig(livekitConfigTemplate, lshcue.FromYAML(secret.Data["server.yaml"]), lshcue.ToYAML())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
previousValue := ctx.BuildFile(previousAST)
|
||||
value, err := internalcue.GenerateConfig(ctx, livekitConfigTemplate, previousValue, map[string]interface{}{
|
||||
"_redis": redisSecret.Data,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
str, err := yaml.Encode(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
secret.Data["server.yaml"] = []byte(str)
|
||||
resources.config = &value
|
||||
secret.Data["server.yaml"] = value
|
||||
resources.config = &cueValue
|
||||
return controllerutil.SetControllerReference(lkServer, &secret, r.Scheme())
|
||||
})
|
||||
}
|
||||
|
|
|
@ -17,7 +17,9 @@ limitations under the License.
|
|||
package cue
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
|
@ -25,6 +27,7 @@ import (
|
|||
|
||||
"cuelang.org/go/cue/cuecontext"
|
||||
"cuelang.org/go/encoding/json"
|
||||
"cuelang.org/go/encoding/toml"
|
||||
"cuelang.org/go/encoding/yaml"
|
||||
"github.com/google/uuid"
|
||||
"github.com/oklog/ulid/v2"
|
||||
|
@ -33,32 +36,60 @@ import (
|
|||
|
||||
var cueDebug = os.Getenv("CUE_DEBUG") == "true"
|
||||
|
||||
func GenerateConfig(ctx *cue.Context, schema string, previousValue cue.Value, extra map[string]interface{}) (cue.Value, error) {
|
||||
type Generator func() interface{}
|
||||
|
||||
type Formatter func(cue.Value) ([]byte, error)
|
||||
|
||||
type GenerateOptions struct {
|
||||
Context *cue.Context
|
||||
Formatter Formatter
|
||||
PreviousValue cue.Value
|
||||
Generators map[string]Generator
|
||||
ExtraValues map[string]interface{}
|
||||
}
|
||||
|
||||
type GenerateOption interface {
|
||||
Apply(*GenerateOptions)
|
||||
}
|
||||
|
||||
func GenerateConfig(schema string, opts ...GenerateOption) ([]byte, cue.Value, error) {
|
||||
ctx := cuecontext.New()
|
||||
options := GenerateOptions{
|
||||
Context: ctx,
|
||||
PreviousValue: ctx.CompileString(""),
|
||||
Generators: map[string]Generator{
|
||||
"key": func() interface{} {
|
||||
return krand.String(32)
|
||||
},
|
||||
"uuid": func() interface{} {
|
||||
return uuid.New().String()
|
||||
},
|
||||
"ulid": func() interface{} {
|
||||
return ulid.Make().String()
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, opt := range opts {
|
||||
opt.Apply(&options)
|
||||
}
|
||||
value := ctx.CompileString(schema)
|
||||
|
||||
for k, v := range extra {
|
||||
for k, v := range options.ExtraValues {
|
||||
value = value.FillPath(cue.MakePath(cue.Hid(k, "_")), v)
|
||||
}
|
||||
|
||||
value.Walk(func(v cue.Value) bool {
|
||||
for _, attr := range v.Attributes(cue.FieldAttr) {
|
||||
if attr.Name() == "lsh" {
|
||||
if strings.HasPrefix(attr.Contents(), "generate:") {
|
||||
pV := previousValue.LookupPath(v.Path())
|
||||
if name, found := strings.CutPrefix(attr.Contents(), "generate:"); found {
|
||||
pV := options.PreviousValue.LookupPath(v.Path())
|
||||
if pV.Exists() && pV.IsConcrete() {
|
||||
value = value.FillPath(v.Path(), pV)
|
||||
continue
|
||||
}
|
||||
var generated string
|
||||
switch attr.Contents() {
|
||||
case "generate:key":
|
||||
generated = krand.String(32)
|
||||
case "generate:uuid":
|
||||
generated = uuid.New().String()
|
||||
case "generate:ulid":
|
||||
generated = ulid.Make().String()
|
||||
if generator, ok := options.Generators[name]; ok {
|
||||
value = value.FillPath(v.Path(), generator())
|
||||
}
|
||||
value = value.FillPath(v.Path(), generated)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,39 +100,130 @@ func GenerateConfig(ctx *cue.Context, schema string, previousValue cue.Value, ex
|
|||
fmt.Println(value)
|
||||
}
|
||||
|
||||
return value, value.Validate()
|
||||
}
|
||||
|
||||
func GenerateConfigYAML(schema string, previous string, extra map[string]interface{}) (string, error) {
|
||||
ctx := cuecontext.New()
|
||||
previousAST, err := yaml.Extract("", previous)
|
||||
err := value.Validate()
|
||||
if err != nil {
|
||||
return "", err
|
||||
return nil, value, err
|
||||
}
|
||||
|
||||
previousValue := ctx.BuildFile(previousAST)
|
||||
value, err := GenerateConfig(ctx, schema, previousValue, extra)
|
||||
if err != nil {
|
||||
return "", err
|
||||
var formatted []byte
|
||||
if options.Formatter != nil {
|
||||
formatted, err = options.Formatter(value)
|
||||
}
|
||||
str, err := yaml.Encode(value)
|
||||
return string(str), err
|
||||
|
||||
return formatted, value, err
|
||||
}
|
||||
|
||||
func GenerateConfigJSON(schema string, previous string, extra map[string]interface{}) (string, error) {
|
||||
ctx := cuecontext.New()
|
||||
if previous == "" {
|
||||
previous = "{}"
|
||||
type FromYAML []byte
|
||||
|
||||
func (o FromYAML) Apply(options *GenerateOptions) {
|
||||
ast, err := yaml.Extract("", []byte(o))
|
||||
if err == nil {
|
||||
options.PreviousValue = options.Context.BuildFile(ast)
|
||||
} else if cueDebug {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
type toYAML struct{}
|
||||
|
||||
func (o toYAML) Apply(options *GenerateOptions) {
|
||||
options.Formatter = yaml.Encode
|
||||
}
|
||||
|
||||
func ToYAML() GenerateOption {
|
||||
return toYAML{}
|
||||
}
|
||||
|
||||
type FromJSON []byte
|
||||
|
||||
func (o FromJSON) Apply(options *GenerateOptions) {
|
||||
if len(o) == 0 {
|
||||
return
|
||||
}
|
||||
ast, err := json.Extract("", o)
|
||||
if err == nil {
|
||||
options.PreviousValue = options.Context.BuildExpr(ast)
|
||||
}
|
||||
}
|
||||
|
||||
func ToJSON() GenerateOption {
|
||||
return toJSON{}
|
||||
}
|
||||
|
||||
type toJSON struct{}
|
||||
|
||||
func (o toJSON) Apply(options *GenerateOptions) {
|
||||
options.Formatter = func(value cue.Value) ([]byte, error) {
|
||||
return value.MarshalJSON()
|
||||
}
|
||||
}
|
||||
|
||||
type FromTOML []byte
|
||||
|
||||
func (o FromTOML) Apply(options *GenerateOptions) {
|
||||
decoder := toml.NewDecoder("", bytes.NewReader(o))
|
||||
ast, err := decoder.Decode()
|
||||
if err == nil {
|
||||
options.PreviousValue = options.Context.BuildExpr(ast)
|
||||
}
|
||||
}
|
||||
|
||||
func ToTOML() GenerateOption {
|
||||
return toTOML{}
|
||||
}
|
||||
|
||||
type toTOML struct{}
|
||||
|
||||
func (o toTOML) Apply(options *GenerateOptions) {
|
||||
options.Formatter = func(value cue.Value) ([]byte, error) {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
encoder := toml.NewEncoder(buf)
|
||||
err := encoder.Encode(value)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return io.ReadAll(buf)
|
||||
}
|
||||
}
|
||||
|
||||
func WithGenerator(id string, generator Generator) GenerateOption {
|
||||
return withGenerator{
|
||||
key: id,
|
||||
value: generator,
|
||||
}
|
||||
}
|
||||
|
||||
type withGenerator struct {
|
||||
key string
|
||||
value Generator
|
||||
}
|
||||
|
||||
func (o withGenerator) Apply(options *GenerateOptions) {
|
||||
if options.Generators == nil {
|
||||
options.Generators = make(map[string]Generator)
|
||||
}
|
||||
if options.Generators[o.key] == nil {
|
||||
options.Generators[o.key] = o.value
|
||||
}
|
||||
}
|
||||
|
||||
func WithValue(id string, value interface{}) GenerateOption {
|
||||
return withValue{
|
||||
key: id,
|
||||
value: value,
|
||||
}
|
||||
}
|
||||
|
||||
type withValue struct {
|
||||
key string
|
||||
value interface{}
|
||||
}
|
||||
|
||||
func (o withValue) Apply(options *GenerateOptions) {
|
||||
if options.ExtraValues == nil {
|
||||
options.ExtraValues = make(map[string]interface{})
|
||||
}
|
||||
if options.ExtraValues[o.key] == nil {
|
||||
options.ExtraValues[o.key] = o.value
|
||||
}
|
||||
previousAST, err := json.Extract("", []byte(previous))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
previousValue := ctx.BuildExpr(previousAST)
|
||||
value, err := GenerateConfig(ctx, schema, previousValue, extra)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
str, err := value.MarshalJSON()
|
||||
return string(str), err
|
||||
}
|
||||
|
|
120
internal/cue/config_test.go
Normal file
120
internal/cue/config_test.go
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
Copyright 2024 IndieHosters.
|
||||
|
||||
Licensed under the EUPL, Version 1.2 or later (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package cue
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"cuelang.org/go/cue"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
func TestCue(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "Cue Suite")
|
||||
}
|
||||
|
||||
var _ = Describe("Checking GenerateConfig function", func() {
|
||||
|
||||
const tpl = `
|
||||
_input: string
|
||||
simple: {
|
||||
hello: "world"
|
||||
}
|
||||
output: _input
|
||||
generate: {
|
||||
key: string @lsh(generate:key)
|
||||
uuid: string @lsh(generate:uuid)
|
||||
ulid: string @lsh(generate:ulid)
|
||||
custom: string @lsh(generate:now)
|
||||
}
|
||||
`
|
||||
|
||||
formatName := []string{"yaml", "json", "toml"}
|
||||
formatTo := []GenerateOption{ToYAML(), ToJSON(), ToTOML()}
|
||||
formatFrom := []reflect.Type{reflect.TypeOf(FromYAML{}), reflect.TypeOf(FromJSON{}), reflect.TypeOf(FromTOML{})}
|
||||
expectedFormat := []string{
|
||||
"simple:\n hello: world\n",
|
||||
`{"simple":{"hello":"world"},`,
|
||||
"[simple]\nhello = 'world'\n",
|
||||
}
|
||||
options := []GenerateOption{
|
||||
WithValue("_input", "ok"),
|
||||
WithGenerator("now", func() interface{} {
|
||||
return time.Now().String()
|
||||
}),
|
||||
}
|
||||
generates := []string{"key", "uuid", "ulid", "custom"}
|
||||
|
||||
for i, format := range formatName {
|
||||
When("format is "+format, Ordered, func() {
|
||||
var value []byte
|
||||
var cueVal cue.Value
|
||||
var err error
|
||||
|
||||
It("generates", func(ctx SpecContext) {
|
||||
value, cueVal, err = GenerateConfig(tpl, append(options, formatTo[i])...)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
|
||||
It("has valid format", func(ctx SpecContext) {
|
||||
Expect(string(value)).To(ContainSubstring(expectedFormat[i]))
|
||||
})
|
||||
|
||||
It("WithValue works", func(ctx SpecContext) {
|
||||
out, err := cueVal.LookupPath(cue.ParsePath("output")).String()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(out).To(Equal("ok"))
|
||||
})
|
||||
|
||||
for _, g := range generates {
|
||||
It("has generated "+g, func(ctx SpecContext) {
|
||||
gen, err := cueVal.LookupPath(cue.ParsePath("generate." + g)).String()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(gen).NotTo(BeEmpty())
|
||||
})
|
||||
}
|
||||
|
||||
var cueVal2 cue.Value
|
||||
|
||||
It("re-generates", func(ctx SpecContext) {
|
||||
v := reflect.New(formatFrom[i]).Elem()
|
||||
v.SetBytes(value)
|
||||
option := v.Interface().(GenerateOption)
|
||||
|
||||
_, cueVal2, err = GenerateConfig(tpl, append(options, formatTo[i], option)...)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
})
|
||||
|
||||
for _, g := range generates {
|
||||
It("don't change generated "+g, func(ctx SpecContext) {
|
||||
gen, err := cueVal.LookupPath(cue.ParsePath("generate." + g)).String()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
|
||||
gen2, err := cueVal2.LookupPath(cue.ParsePath("generate." + g)).String()
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
|
||||
Expect(gen2).To(Equal(gen))
|
||||
})
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
})
|
Loading…
Reference in a new issue