Skip to content

Commit

Permalink
Add extra documentation around glue
Browse files Browse the repository at this point in the history
  • Loading branch information
jwoudenberg committed Oct 20, 2024
1 parent 573d433 commit 1ab8fd5
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
33 changes: 33 additions & 0 deletions crates/glue/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Glue

Glue is a bit of tooling built into Roc to help with platform development. Roc platforms are written in a different language than Roc, and some it requires some finesse to let other languages to read and write Roc types like records and unions in a way compatible with how Roc uses those types.

The `roc glue` command generates code in other languages for interacting with the Roc types used by your platform. It takes three arguments:

1. A 'glue spec', this is a Roc file specifying how to output type helpers fora particular language. You can find some examples in the src/ subdirectory:

- **RustGlue.roc:** Generates Roc bindings for rust platforms.
- **ZigGlue.roc:** Generates Roc bindings for zig platforms (out of date).
- **DescribeGlue.roc:** Does not generate Roc bindings, but outputs some information about the types that assist writing compatible types in other languages by hand.

2. A 'glue dir', specifying where glue should place generated files. Pass any directory you want here.

3. A .roc file exposing some types that glue should generate code for. You can extend the template below.


```roc
platform "glue-types"
requires {} { main : _ }
exposes []
packages {}
imports []
provides [mainForHost]
GlueTypes : {
a : SomeType,
b : AnotherType,
}
mainForHost : GlueTypes
mainForHost = main
```
13 changes: 13 additions & 0 deletions crates/glue/src/DescribeGlue.roc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
app [makeGlue] { pf: platform "../platform/main.roc" }

import pf.Types exposing [Types]
import pf.File exposing [File]

makeGlue : List Types -> Result (List File) Str
makeGlue = \types ->
Ok [
{
name: "types.txt",
content: List.map types Inspect.toStr |> Str.joinWith "\n",
},
]

0 comments on commit 1ab8fd5

Please sign in to comment.