Skip to content

Commit

Permalink
howto: go-api-basics
Browse files Browse the repository at this point in the history
First cut.

DO NOT SUBMIT
DO NOT REVIEW

Preview-Path: /docs/howto/go-api-basics
Signed-off-by: Paul Jolly <[email protected]>
Change-Id: If4b9c36c934ee348944cfca091bf1ba2abbe967c
Dispatch-Trailer: {"type":"trybot","CL":1170263,"patchset":46,"ref":"refs/changes/63/1170263/46","targetBranch":"alpha"}
  • Loading branch information
myitcv authored and cueckoo committed Feb 18, 2024
1 parent 4525aeb commit 5f452d4
Show file tree
Hide file tree
Showing 5 changed files with 378 additions and 0 deletions.
106 changes: 106 additions & 0 deletions content/docs/howto/go-api-basics/en.md
Original file line number Diff line number Diff line change
@@ -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}}}
106 changes: 106 additions & 0 deletions content/docs/howto/go-api-basics/gen_cache.cue
Original file line number Diff line number Diff line change
@@ -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/[email protected]"
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
"""
}]
}
}
}
}
}
}
}
}
15 changes: 15 additions & 0 deletions content/docs/howto/go-api-basics/page.cue
Original file line number Diff line number Diff line change
@@ -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"
},
]
}
116 changes: 116 additions & 0 deletions hugo/content/en/docs/howto/go-api-basics/index.md
Original file line number Diff line number Diff line change
@@ -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/[email protected]
...
$ 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
```
35 changes: 35 additions & 0 deletions site.cue
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5f452d4

Please sign in to comment.