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..e9e6ae112 --- /dev/null +++ b/content/docs/howto/go-api-basics/en.md @@ -0,0 +1,106 @@ +--- +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" + "log" + "path/filepath" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/cuecontext" + "cuelang.org/go/cue/load" +) + +func main() { + // Load the package "example" from the current directory. + // We don't need to specify a config in this case. + insts := load.Instances([]string{"."}, nil) + + // The current directory just has one file without any build tags, + // and that file belongs to the example package. + // 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 { + log.Fatal(err) + } + 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 { + log.Fatal(err) + } + + // Inspect the contents of the value, such as one string field. + fieldStr, err := val.LookupPath(cue.MakePath(cue.Str("output"))).String() + if err != nil { + log.Fatal(err) + } + fmt.Println("Field string:", fieldStr) +} +{{{end}}} + +{{{with script "en" "go test"}}} +#ellipsis 0 +go get cuelang.org/go@$CUELANG_CUE_PRERELEASE +#ellipsis 0 +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..44399e966 --- /dev/null +++ b/content/docs/howto/go-api-basics/gen_cache.cue @@ -0,0 +1,106 @@ +package site +{ + content: { + docs: { + howto: { + "go-api-basics": { + page: { + cache: { + upload: { + "initial cue code": "whpLuwZrcPlVslcTMolUXR5uRtewzV4cvAQPOysFNu8=" + "initial go code": "BbIEzTkQP8zq+FHcDBQj1SLV6DRMQsSNuOnLf0w1PLc=" + } + multi_step: { + "9FVLHACQ57639SR2GHJHQQCJMJTBO6E0NONPFVBP0V1LUO86OEQG====": [{ + 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 0" + cmd: "go get cuelang.org/go@v0.8.0-alpha.1" + exitCode: 0 + output: """ + ... + + """ + }, { + doc: "#ellipsis 0" + cmd: "go mod tidy" + exitCode: 0 + output: """ + ... + + """ + }, { + doc: "" + cmd: "go run ." + exitCode: 0 + output: """ + Number of instances: 1 + Instance module: company.com/example@v0 + Instance import path: company.com/example@v0:example + + Source files: + some.cue with 3 declarations + + Field string: Hello Joe + + """ + }] + } + } + } + } + } + } + } +} 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/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..d8b5056f6 --- /dev/null +++ b/hugo/content/en/docs/howto/go-api-basics/index.md @@ -0,0 +1,116 @@ +--- +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" + "log" + "path/filepath" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/cuecontext" + "cuelang.org/go/cue/load" +) + +func main() { + // Load the package "example" from the current directory. + // We don't need to specify a config in this case. + insts := load.Instances([]string{"."}, nil) + + // The current directory just has one file without any build tags, + // and that file belongs to the example package. + // 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 { + log.Fatal(err) + } + 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 { + log.Fatal(err) + } + + // Inspect the contents of the value, such as one string field. + fieldStr, err := val.LookupPath(cue.MakePath(cue.Str("output"))).String() + if err != nil { + log.Fatal(err) + } + fmt.Println("Field string:", fieldStr) +} +``` + +```text { title="TERMINAL" codeToCopy="Z28gZ2V0IGN1ZWxhbmcub3JnL2dvQHYwLjguMC1hbHBoYS4xCmdvIG1vZCB0aWR5CmdvIHJ1biAuCg==" } +$ go get cuelang.org/go@v0.8.0-alpha.1 +... +$ go mod tidy +... +$ go run . +Number of instances: 1 +Instance module: company.com/example@v0 +Instance import path: company.com/example@v0:example + +Source files: +some.cue with 3 declarations + +Field string: Hello Joe +``` 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