diff --git a/content/docs/howto/go-api-basics/en.md b/content/docs/howto/go-api-basics/en.md new file mode 100644 index 000000000..995566c79 --- /dev/null +++ b/content/docs/howto/go-api-basics/en.md @@ -0,0 +1,109 @@ +--- +title: Go API basics +tags: +- go api +authors: +- myitcv +toc_hide: true +--- + +This howto demonstrates getting started with CUE's Go API. + +{{{with _script "en" "set caches to speed up re-running"}}} +export GOMODCACHE=/caches/gomodcache +export GOCACHE=/caches/gobuild +{{{end}}} + +{{{with script "en" "cue version"}}} +#ellipsis 1 +cue version +{{{end}}} + +{{{with script "en" "go version"}}} +go version +{{{end}}} + +{{{with script "en" "start modules"}}} +cue mod init company.com/example +go mod init company.com/example +{{{end}}} + +{{{with upload "en" "initial cue code"}}} +-- some.cue -- +package example + +output: "Hello \(name)" +name: "Joe" +{{{end}}} + + +{{{with script "en" "cue export"}}} +cue export . +{{{end}}} + + +{{{with upload "en" "initial go code"}}} +-- main.go -- +package main + +import ( + "fmt" + "path/filepath" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/cuecontext" + "cuelang.org/go/cue/load" +) + +func main() { + // Load the package "example" relative to the directory testdata/testmod. + // Akin to loading via: cd testdata/testmod && cue export ./example + insts := load.Instances([]string{"./example"}, &load.Config{ + Dir: filepath.Join("testdata", "testmod"), + }) + + // testdata/testmod/example just has one file without any build tags, + // so we get a single instance as a result. + fmt.Println("Number of instances:", len(insts)) + inst := insts[0] + if err := inst.Err; err != nil { + fmt.Println(err) + return + } + fmt.Println("Instance module:", inst.Module) + fmt.Println("Instance import path:", inst.ImportPath) + fmt.Println() + + // Inspect the syntax trees. + fmt.Println("Source files:") + for _, file := range inst.Files { + fmt.Println(filepath.Base(file.Filename), "with", len(file.Decls), "declarations") + } + fmt.Println() + + // Build the instance into a value. + // We can also use BuildInstances for many instances at once. + ctx := cuecontext.New() + val := ctx.BuildInstance(inst) + if err := val.Err(); err != nil { + fmt.Println(err) + return + } + + // Inspect the contents of the value, such as one string field. + fieldStr, err := val.LookupPath(cue.MakePath(cue.Str("output"))).String() + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Field string:", fieldStr) +} +{{{end}}} + +{{{with script "en" "go test"}}} +#ellipsis 1 +go get cuelang.org/go@$CUELANG_CUE_PRERELEASE +#ellipsis 1 +go mod tidy +go run . +{{{end}}} diff --git a/content/docs/howto/go-api-basics/gen_cache.cue b/content/docs/howto/go-api-basics/gen_cache.cue new file mode 100644 index 000000000..87d8e7159 --- /dev/null +++ b/content/docs/howto/go-api-basics/gen_cache.cue @@ -0,0 +1,101 @@ +package site +{ + content: { + docs: { + howto: { + "go-api-basics": { + page: { + cache: { + upload: { + "initial cue code": "jWe0OgkbaUMRT5TXFTT9jBahUEWjNnCw8OBOFPI6aNI=" + "initial go code": "S/R3bYsKxXmiPFcD+j2Mb7Mmt2ZIRvRSew+pAbnK/2o=" + } + multi_step: { + "IIK2OAKQRINKHHJ3FS32OSCVVTU4VR7RJLARQAMR194OG5AB8VI0====": [{ + doc: "" + cmd: "export GOMODCACHE=/caches/gomodcache" + exitCode: 0 + output: "" + }, { + doc: "" + cmd: "export GOCACHE=/caches/gobuild" + exitCode: 0 + output: "" + }, { + doc: "#ellipsis 1" + cmd: "cue version" + exitCode: 0 + output: """ + cue version v0.8.0-alpha.1 + ... + + """ + }, { + doc: "" + cmd: "go version" + exitCode: 0 + output: """ + go version go1.22.0 linux/amd64 + + """ + }, { + doc: "" + cmd: "cue mod init company.com/example" + exitCode: 0 + output: "" + }, { + doc: "" + cmd: "go mod init company.com/example" + exitCode: 0 + output: """ + go: creating new go.mod: module company.com/example + go: to add module requirements and sums: + \tgo mod tidy + + """ + }, { + doc: "" + cmd: "cue export ." + exitCode: 0 + output: """ + { + "output": "Hello Joe", + "name": "Joe" + } + + """ + }, { + doc: "#ellipsis 1" + cmd: "go get cuelang.org/go@v0.8.0-alpha.1" + exitCode: 0 + output: """ + go: added cuelang.org/go v0.8.0-alpha.1 + ... + + """ + }, { + doc: "#ellipsis 1" + cmd: "go mod tidy" + exitCode: 0 + output: """ + ... + + """ + }, { + doc: "" + cmd: "go run ." + exitCode: 0 + output: """ + Number of instances: 1 + cannot find package "./example" + + """ + }] + } + } + } + } + } + } + } +} diff --git a/content/docs/howto/go-api-basics/page.cue b/content/docs/howto/go-api-basics/page.cue new file mode 100644 index 000000000..862636929 --- /dev/null +++ b/content/docs/howto/go-api-basics/page.cue @@ -0,0 +1,15 @@ +package site + +content: docs: howto: "go-api-basics": { + page: comparators: [ + { + kind: "patternComparator" + command: "go test" + pattern: expr: #"(?m)^ok .*\t(\d(\.\d+)?)s"# + }, + { + kind: "unstableLineOrderComparator" + command: "go test" + }, + ] +} diff --git a/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/en.md b/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/en.md index 4ea6376f9..ddd73bd81 100644 --- a/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/en.md +++ b/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/en.md @@ -16,7 +16,7 @@ to check that values represent valid IPv4 or IPv6 addresses or subnets in {{{with code "en" "cc"}}} #location top bottom -! exec cue vet +! exec cue vet cmp stderr out -- file.cue -- package example diff --git a/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/gen_cache.cue b/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/gen_cache.cue index a89ddce6c..6fc917024 100644 --- a/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/gen_cache.cue +++ b/content/docs/howto/use-net-ipcidr-to-validate-ip-cidr-ranges/gen_cache.cue @@ -7,7 +7,7 @@ package site page: { cache: { code: { - cc: "6yMUf70U8a/13E7pnUzKc/pyHxinGe/BnvPh3gkX7Do=" + cc: "kHDSSBhyDfvMLjl0fNGS+4HK9DkPN50tSKmmx1ke0ZA=" } } } diff --git a/hugo/content/en/docs/howto/go-api-basics/index.md b/hugo/content/en/docs/howto/go-api-basics/index.md new file mode 100644 index 000000000..17655c425 --- /dev/null +++ b/hugo/content/en/docs/howto/go-api-basics/index.md @@ -0,0 +1,115 @@ +--- +title: Go API basics +tags: +- go api +authors: +- myitcv +toc_hide: true +--- + +This howto demonstrates getting started with CUE's Go API. + +```text { title="TERMINAL" codeToCopy="Y3VlIHZlcnNpb24K" } +$ cue version +cue version v0.8.0-alpha.1 +... +``` + +```text { title="TERMINAL" codeToCopy="Z28gdmVyc2lvbgo=" } +$ go version +go version go1.22.0 linux/amd64 +``` + +```text { title="TERMINAL" codeToCopy="Y3VlIG1vZCBpbml0IGNvbXBhbnkuY29tL2V4YW1wbGUKZ28gbW9kIGluaXQgY29tcGFueS5jb20vZXhhbXBsZQo=" } +$ cue mod init company.com/example +$ go mod init company.com/example +go: creating new go.mod: module company.com/example +go: to add module requirements and sums: + go mod tidy +``` + +```cue { title="some.cue" } +package example + +output: "Hello \(name)" +name: "Joe" +``` + + +```text { title="TERMINAL" codeToCopy="Y3VlIGV4cG9ydCAuCg==" } +$ cue export . +{ + "output": "Hello Joe", + "name": "Joe" +} +``` + + +```go { title="main.go" } +package main + +import ( + "fmt" + "path/filepath" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/cuecontext" + "cuelang.org/go/cue/load" +) + +func main() { + // Load the package "example" relative to the directory testdata/testmod. + // Akin to loading via: cd testdata/testmod && cue export ./example + insts := load.Instances([]string{"./example"}, &load.Config{ + Dir: filepath.Join("testdata", "testmod"), + }) + + // testdata/testmod/example just has one file without any build tags, + // so we get a single instance as a result. + fmt.Println("Number of instances:", len(insts)) + inst := insts[0] + if err := inst.Err; err != nil { + fmt.Println(err) + return + } + fmt.Println("Instance module:", inst.Module) + fmt.Println("Instance import path:", inst.ImportPath) + fmt.Println() + + // Inspect the syntax trees. + fmt.Println("Source files:") + for _, file := range inst.Files { + fmt.Println(filepath.Base(file.Filename), "with", len(file.Decls), "declarations") + } + fmt.Println() + + // Build the instance into a value. + // We can also use BuildInstances for many instances at once. + ctx := cuecontext.New() + val := ctx.BuildInstance(inst) + if err := val.Err(); err != nil { + fmt.Println(err) + return + } + + // Inspect the contents of the value, such as one string field. + fieldStr, err := val.LookupPath(cue.MakePath(cue.Str("output"))).String() + if err != nil { + fmt.Println(err) + return + } + fmt.Println("Field string:", fieldStr) +} +``` + +```text { title="TERMINAL" codeToCopy="Z28gZ2V0IGN1ZWxhbmcub3JnL2dvQHYwLjguMC1hbHBoYS4xCmdvIG1vZCB0aWR5CmdvIHJ1biAuCg==" } +$ go get cuelang.org/go@v0.8.0-alpha.1 +go: added cuelang.org/go v0.8.0-alpha.1 +... + +$ go mod tidy +... +$ go run . +Number of instances: 1 +cannot find package "./example" +``` diff --git a/site.cue b/site.cue index 1f370ff44..3050dceb2 100644 --- a/site.cue +++ b/site.cue @@ -42,6 +42,41 @@ _contentDefaults: { page: { leftDelim: *"{{{" | _ rightDelim: *"}}}" | _ + + comparators: *[ + { + kind: "patternComparator" + command: "go test" + pattern: expr: #"(?m)^ok .*\t(\d(\.\d+)?)s"# + }, + ] | _ + + sanitisers: *[ + { + kind: "patternSanitiser" + command: "go version" + pattern: expr: #"(?m)linux\/.+$"# + replacement: "linux/amd64" + }, + { + kind: "patternSanitiser" + command: "cue version" + pattern: expr: #"(?m)GOARCH .+$"# + replacement: "GOARCH amd64" + }, + { + kind: "patternSanitiser" + command: "cue version" + pattern: expr: #"(?m)GOOS .+$"# + replacement: "GOOS linux" + }, + { + kind: "patternSanitiser" + command: "cue version" + pattern: expr: #"(?m)^\s*GOAMD64 .*\n"# + replacement: "" + }, + ] | _ } } content: _contentDefaults