From 9a0b0d9a05ad6ef704ccc1d7ec7964f8658c2cfa Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Sun, 31 Dec 2023 22:59:55 +0900 Subject: [PATCH] doc(book): use Vuepress for the book --- book/.editorconfig | 2 + book/.gitignore | 5 +- book/.vitepress/config.mjs | 126 ++++++++++++++ book/Justfile | 6 +- book/{highlight => }/biome.json | 0 book/book.toml | 17 -- book/highlight/.gitignore | 1 - book/highlight/package.json | 17 -- book/highlight/src/ayu-highlight.css | 80 --------- book/highlight/src/css/overrides.css | 3 - book/highlight/src/highlight.css | 84 --------- book/highlight/src/highlight.ts | 28 --- book/highlight/src/languages/stef.ts | 138 --------------- book/highlight/src/tomorrow-night.css | 2 - book/package.json | 14 ++ book/src/SUMMARY.md | 45 ----- book/src/cli/index.md | 1 - book/src/compiler/index.md | 3 - book/src/general_idea.md | 56 ------ book/src/generators/index.md | 3 - book/src/guide/creating.md | 8 +- book/src/guide/examples.md | 4 +- book/src/guide/generating.md | 4 +- book/src/guide/index.md | 1 + book/src/guide/installation.md | 2 +- book/src/ideas.md | 2 + book/src/index.md | 48 ++++++ book/src/misc/team.md | 38 +++++ book/src/public/logo.svg | 15 ++ .../basic.stef => reference/cli/check.md} | 0 book/src/reference/cli/format.md | 0 book/src/reference/cli/index.md | 0 book/src/reference/cli/lint.md | 0 book/src/reference/index.md | 1 + book/src/reference/schema/arrays.md | 17 ++ .../{ => reference}/schema/arrays/basic.go | 3 + .../{ => reference}/schema/arrays/basic.kt | 2 + .../{ => reference}/schema/arrays/basic.py | 4 + .../{ => reference}/schema/arrays/basic.rs | 0 .../{ => reference}/schema/arrays/basic.stef | 0 .../{ => reference}/schema/arrays/basic.ts | 0 book/src/{ => reference}/schema/attributes.md | 2 +- book/src/{ => reference}/schema/constants.md | 43 +---- .../{ => reference}/schema/constants/basic.go | 3 + .../{ => reference}/schema/constants/basic.kt | 2 + .../{ => reference}/schema/constants/basic.py | 0 .../{ => reference}/schema/constants/basic.rs | 0 .../schema/constants/basic.stef | 0 .../{ => reference}/schema/constants/basic.ts | 0 book/src/reference/schema/enums.md | 35 ++++ .../{ => reference}/schema/enums/advanced.go | 2 + .../{ => reference}/schema/enums/advanced.kt | 2 + .../{ => reference}/schema/enums/advanced.py | 4 + .../{ => reference}/schema/enums/advanced.rs | 0 .../schema/enums/advanced.stef | 0 .../{ => reference}/schema/enums/advanced.ts | 0 .../src/{ => reference}/schema/enums/basic.go | 3 + .../src/{ => reference}/schema/enums/basic.kt | 2 + .../src/{ => reference}/schema/enums/basic.py | 4 + .../src/{ => reference}/schema/enums/basic.rs | 0 .../{ => reference}/schema/enums/basic.stef | 0 .../src/{ => reference}/schema/enums/basic.ts | 0 book/src/reference/schema/imports.md | 7 + .../{ => reference}/schema/imports/basic.stef | 0 book/src/{ => reference}/schema/index.md | 4 +- book/src/reference/schema/modules.md | 13 ++ .../{ => reference}/schema/modules/basic.stef | 0 .../schema/modules/nesting.stef | 0 book/src/reference/schema/references.md | 7 + .../reference/schema/references/basic.stef | 0 book/src/reference/schema/statics.md | 3 + book/src/{ => reference}/schema/structs.md | 161 +++++------------- .../schema/structs/generics.go | 3 + .../schema/structs/generics.kt | 2 + .../schema/structs/generics.py | 5 +- .../schema/structs/generics.rs | 0 .../schema/structs/generics.stef | 0 .../schema/structs/generics.ts | 0 .../{ => reference}/schema/structs/named.go | 3 + .../{ => reference}/schema/structs/named.kt | 2 + .../{ => reference}/schema/structs/named.py | 4 + .../{ => reference}/schema/structs/named.rs | 0 .../{ => reference}/schema/structs/named.stef | 0 .../{ => reference}/schema/structs/named.ts | 0 .../{ => reference}/schema/structs/unit.go | 3 + book/src/reference/schema/structs/unit.kt | 5 + .../{ => reference}/schema/structs/unit.py | 4 + .../{ => reference}/schema/structs/unit.rs | 0 .../{ => reference}/schema/structs/unit.stef | 0 .../{ => reference}/schema/structs/unit.ts | 0 .../{ => reference}/schema/structs/unnamed.go | 3 + .../{ => reference}/schema/structs/unnamed.kt | 2 + .../{ => reference}/schema/structs/unnamed.py | 4 + .../{ => reference}/schema/structs/unnamed.rs | 0 .../schema/structs/unnamed.stef | 0 .../{ => reference}/schema/structs/unnamed.ts | 0 book/src/{ => reference}/schema/tuples.md | 35 ++-- .../{ => reference}/schema/tuples/basic.go | 3 + .../{ => reference}/schema/tuples/basic.kt | 2 + .../{ => reference}/schema/tuples/basic.py | 4 + .../{ => reference}/schema/tuples/basic.rs | 0 .../{ => reference}/schema/tuples/basic.stef | 0 .../{ => reference}/schema/tuples/basic.ts | 0 book/src/reference/schema/type-aliases.md | 25 +++ .../schema/type-aliases/basic.go | 3 + .../schema/type-aliases/basic.kt | 2 + .../schema/type-aliases/basic.py | 2 + .../schema/type-aliases/basic.rs | 0 .../schema/type-aliases/basic.stef | 0 .../schema/type-aliases/basic.ts | 0 .../index.md => reference/wire-format.md} | 2 +- book/src/schema/arrays.md | 42 ----- book/src/schema/enums.md | 84 --------- book/src/schema/imports.md | 9 - book/src/schema/modules.md | 17 -- book/src/schema/references.md | 9 - book/src/schema/statics.md | 3 - book/src/schema/structs/unit.kt | 3 - book/src/schema/type-aliases.md | 50 ------ bun.lockb | Bin 88384 -> 46280 bytes package.json | 2 +- vscode-extension/package.json | 2 +- 122 files changed, 518 insertions(+), 898 deletions(-) create mode 100644 book/.editorconfig create mode 100644 book/.vitepress/config.mjs rename book/{highlight => }/biome.json (100%) delete mode 100644 book/book.toml delete mode 100644 book/highlight/.gitignore delete mode 100644 book/highlight/package.json delete mode 100644 book/highlight/src/ayu-highlight.css delete mode 100644 book/highlight/src/css/overrides.css delete mode 100644 book/highlight/src/highlight.css delete mode 100644 book/highlight/src/highlight.ts delete mode 100644 book/highlight/src/languages/stef.ts delete mode 100644 book/highlight/src/tomorrow-night.css create mode 100644 book/package.json delete mode 100644 book/src/SUMMARY.md delete mode 100644 book/src/cli/index.md delete mode 100644 book/src/compiler/index.md delete mode 100644 book/src/general_idea.md delete mode 100644 book/src/generators/index.md create mode 100644 book/src/guide/index.md create mode 100644 book/src/index.md create mode 100644 book/src/misc/team.md create mode 100644 book/src/public/logo.svg rename book/src/{schema/references/basic.stef => reference/cli/check.md} (100%) create mode 100644 book/src/reference/cli/format.md create mode 100644 book/src/reference/cli/index.md create mode 100644 book/src/reference/cli/lint.md create mode 100644 book/src/reference/index.md create mode 100644 book/src/reference/schema/arrays.md rename book/src/{ => reference}/schema/arrays/basic.go (62%) rename book/src/{ => reference}/schema/arrays/basic.kt (62%) rename book/src/{ => reference}/schema/arrays/basic.py (68%) rename book/src/{ => reference}/schema/arrays/basic.rs (100%) rename book/src/{ => reference}/schema/arrays/basic.stef (100%) rename book/src/{ => reference}/schema/arrays/basic.ts (100%) rename book/src/{ => reference}/schema/attributes.md (98%) rename book/src/{ => reference}/schema/constants.md (51%) rename book/src/{ => reference}/schema/constants/basic.go (91%) rename book/src/{ => reference}/schema/constants/basic.kt (93%) rename book/src/{ => reference}/schema/constants/basic.py (100%) rename book/src/{ => reference}/schema/constants/basic.rs (100%) rename book/src/{ => reference}/schema/constants/basic.stef (100%) rename book/src/{ => reference}/schema/constants/basic.ts (100%) create mode 100644 book/src/reference/schema/enums.md rename book/src/{ => reference}/schema/enums/advanced.go (88%) rename book/src/{ => reference}/schema/enums/advanced.kt (85%) rename book/src/{ => reference}/schema/enums/advanced.py (88%) rename book/src/{ => reference}/schema/enums/advanced.rs (100%) rename book/src/{ => reference}/schema/enums/advanced.stef (100%) rename book/src/{ => reference}/schema/enums/advanced.ts (100%) rename book/src/{ => reference}/schema/enums/basic.go (75%) rename book/src/{ => reference}/schema/enums/basic.kt (72%) rename book/src/{ => reference}/schema/enums/basic.py (75%) rename book/src/{ => reference}/schema/enums/basic.rs (100%) rename book/src/{ => reference}/schema/enums/basic.stef (100%) rename book/src/{ => reference}/schema/enums/basic.ts (100%) create mode 100644 book/src/reference/schema/imports.md rename book/src/{ => reference}/schema/imports/basic.stef (100%) rename book/src/{ => reference}/schema/index.md (98%) create mode 100644 book/src/reference/schema/modules.md rename book/src/{ => reference}/schema/modules/basic.stef (100%) rename book/src/{ => reference}/schema/modules/nesting.stef (100%) create mode 100644 book/src/reference/schema/references.md create mode 100644 book/src/reference/schema/references/basic.stef create mode 100644 book/src/reference/schema/statics.md rename book/src/{ => reference}/schema/structs.md (63%) rename book/src/{ => reference}/schema/structs/generics.go (66%) rename book/src/{ => reference}/schema/structs/generics.kt (64%) rename book/src/{ => reference}/schema/structs/generics.py (81%) rename book/src/{ => reference}/schema/structs/generics.rs (100%) rename book/src/{ => reference}/schema/structs/generics.stef (100%) rename book/src/{ => reference}/schema/structs/generics.ts (100%) rename book/src/{ => reference}/schema/structs/named.go (83%) rename book/src/{ => reference}/schema/structs/named.kt (71%) rename book/src/{ => reference}/schema/structs/named.py (75%) rename book/src/{ => reference}/schema/structs/named.rs (100%) rename book/src/{ => reference}/schema/structs/named.stef (100%) rename book/src/{ => reference}/schema/structs/named.ts (100%) rename book/src/{ => reference}/schema/structs/unit.go (54%) create mode 100644 book/src/reference/schema/structs/unit.kt rename book/src/{ => reference}/schema/structs/unit.py (64%) rename book/src/{ => reference}/schema/structs/unit.rs (100%) rename book/src/{ => reference}/schema/structs/unit.stef (100%) rename book/src/{ => reference}/schema/structs/unit.ts (100%) rename book/src/{ => reference}/schema/structs/unnamed.go (79%) rename book/src/{ => reference}/schema/structs/unnamed.kt (64%) rename book/src/{ => reference}/schema/structs/unnamed.py (69%) rename book/src/{ => reference}/schema/structs/unnamed.rs (100%) rename book/src/{ => reference}/schema/structs/unnamed.stef (100%) rename book/src/{ => reference}/schema/structs/unnamed.ts (100%) rename book/src/{ => reference}/schema/tuples.md (82%) rename book/src/{ => reference}/schema/tuples/basic.go (84%) rename book/src/{ => reference}/schema/tuples/basic.kt (85%) rename book/src/{ => reference}/schema/tuples/basic.py (69%) rename book/src/{ => reference}/schema/tuples/basic.rs (100%) rename book/src/{ => reference}/schema/tuples/basic.stef (100%) rename book/src/{ => reference}/schema/tuples/basic.ts (100%) create mode 100644 book/src/reference/schema/type-aliases.md rename book/src/{ => reference}/schema/type-aliases/basic.go (63%) rename book/src/{ => reference}/schema/type-aliases/basic.kt (56%) rename book/src/{ => reference}/schema/type-aliases/basic.py (77%) rename book/src/{ => reference}/schema/type-aliases/basic.rs (100%) rename book/src/{ => reference}/schema/type-aliases/basic.stef (100%) rename book/src/{ => reference}/schema/type-aliases/basic.ts (100%) rename book/src/{wire-format/index.md => reference/wire-format.md} (99%) delete mode 100644 book/src/schema/arrays.md delete mode 100644 book/src/schema/enums.md delete mode 100644 book/src/schema/imports.md delete mode 100644 book/src/schema/modules.md delete mode 100644 book/src/schema/references.md delete mode 100644 book/src/schema/statics.md delete mode 100644 book/src/schema/structs/unit.kt delete mode 100644 book/src/schema/type-aliases.md diff --git a/book/.editorconfig b/book/.editorconfig new file mode 100644 index 0000000..6dfe209 --- /dev/null +++ b/book/.editorconfig @@ -0,0 +1,2 @@ +[*.kt] +ktlint_standard_filename = disabled diff --git a/book/.gitignore b/book/.gitignore index 5050c83..4ec20cd 100644 --- a/book/.gitignore +++ b/book/.gitignore @@ -1,2 +1,3 @@ -/book -/theme +/.vitepress/cache +/.vitepress/dist +/node_modules diff --git a/book/.vitepress/config.mjs b/book/.vitepress/config.mjs new file mode 100644 index 0000000..bb23387 --- /dev/null +++ b/book/.vitepress/config.mjs @@ -0,0 +1,126 @@ +import { defineConfig } from "vitepress"; +import stefGrammar from "../../vscode-extension/syntaxes/stef.tmLanguage.json"; + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "Stef", + description: "Strongly Typed Encoding Format", + srcDir: "src", + base: "/stef", + markdown: { + theme: { + dark: "one-dark-pro", + light: "min-light", + }, + languages: [ + { + ...stefGrammar, + name: "stef", + }, + ], + lineNumbers: true, + }, + vite: { + resolve: { + preserveSymlinks: true, + }, + }, + head: [["link", { rel: "icon", type: "image/svg+xml", href: "/logo.svg" }]], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: "/logo.svg", + editLink: { + pattern: "https://github.com/dnaka91/stef/edit/main/book/src/:path", + }, + nav: [ + { text: "Guide", link: "/guide/", activeMatch: "/guide/" }, + { text: "Reference", link: "/reference/", activeMatch: "/reference/" }, + ], + + sidebar: [ + { text: "Introduction", link: "/introduction" }, + { text: "Ideas", link: "/ideas" }, + { + text: "User Guide", + items: [ + { text: "Installation", link: "/guide/installation" }, + { text: "Creating schemas", link: "/guide/creating" }, + { text: "Generating code", link: "/guide/generating" }, + { text: "Examples", link: "/guide/examples" }, + ], + }, + { + text: "Reference", + items: [ + { + text: "Command Line Interface", + link: "/reference/cli/", + items: [ + { text: "stef lint", link: "/reference/cli/lint" }, + { text: "stef check", link: "/reference/cli/check" }, + { text: "stef format", link: "/reference/cli/format" }, + ], + }, + { + text: "Schema", + link: "/reference/schema/", + items: [ + { text: "Structs", link: "/reference/schema/structs" }, + { text: "Enums", link: "/reference/schema/enums" }, + { text: "Arrays", link: "/reference/schema/arrays" }, + { text: "Tuples", link: "/reference/schema/tuples" }, + { text: "Constants", link: "/reference/schema/constants" }, + { text: "Statics", link: "/reference/schema/statics" }, + { text: "Type Aliases", link: "/reference/schema/type-aliases" }, + { text: "Modules", link: "/reference/schema/modules" }, + { text: "Imports", link: "/reference/schema/imports" }, + { text: "References", link: "/reference/schema/references" }, + { text: "Attributes", link: "/reference/schema/attributes" }, + ], + }, + { + text: "Wire Format", + link: "/reference/wire-format", + }, + { + text: "Compiler", + link: "/reference/compiler", + }, + { + text: "Generators", + link: "/reference/generators/", + items: [ + { text: "Rust", link: "/reference/generators/rust" }, + { text: "Go", link: "/reference/generators/go" }, + ], + }, + ], + }, + { + text: "Miscellaneous", + items: [ + { text: "Team", link: "/misc/team" }, + { text: "License", link: "/misc/license" }, + ], + }, + ], + + outline: "deep", + + socialLinks: [{ icon: "github", link: "https://github.com/dnaka91/stef" }], + + footer: { + message: "Released under the MIT License.", + copyright: "Copyright © 2023-present Dominik Nakamura", + }, + + docFooter: { + prev: false, + next: false, + }, + + search: { + provider: "local", + }, + }, +}); diff --git a/book/Justfile b/book/Justfile index cc34f1d..aa94eb7 100644 --- a/book/Justfile +++ b/book/Justfile @@ -52,7 +52,7 @@ format: gofmt -w {{files}} @format-kotlin +files: - ktlint -F --disabled_rules=filename {{files}} + ktlint -F {{files}} @format-typescript +files: prettier --log-level warn -w {{files}} @@ -61,7 +61,7 @@ format: black -q {{files}} dev: - mdbook serve + bun run dev build: - mdbook build + bun run build diff --git a/book/highlight/biome.json b/book/biome.json similarity index 100% rename from book/highlight/biome.json rename to book/biome.json diff --git a/book/book.toml b/book/book.toml deleted file mode 100644 index 60e133c..0000000 --- a/book/book.toml +++ /dev/null @@ -1,17 +0,0 @@ -[book] -title = "STEF - Strongly Typed Encoding Format" -authors = ["Dominik Nakamura"] -description = "Strongly Typed Encoding Format" -language = "en" -multilingual = false -src = "src" - -[preprocessor.toc] -command = "mdbook-toc" -renderer = ["html"] - -[output.html] -git-repository-url = "https://github.com/dnaka91/stef" - -[output.html.playground] -runnable = false diff --git a/book/highlight/.gitignore b/book/highlight/.gitignore deleted file mode 100644 index 07e6e47..0000000 --- a/book/highlight/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules diff --git a/book/highlight/package.json b/book/highlight/package.json deleted file mode 100644 index cc8f966..0000000 --- a/book/highlight/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "highlight", - "private": true, - "scripts": { - "esbuild": "esbuild src/*.{css,ts} --outdir=../theme --target=es2016 --global-name=hljs --legal-comments=none --bundle", - "watch": "bun run esbuild --watch", - "build": "bun run esbuild --minify", - "lint": "biome check --apply src/**/*.ts" - }, - "dependencies": { - "highlight.js": "^11.9.0" - }, - "devDependencies": { - "@biomejs/biome": "^1.4.1", - "esbuild": "^0.19.10" - } -} diff --git a/book/highlight/src/ayu-highlight.css b/book/highlight/src/ayu-highlight.css deleted file mode 100644 index 1a01d6b..0000000 --- a/book/highlight/src/ayu-highlight.css +++ /dev/null @@ -1,80 +0,0 @@ -@import "./css/overrides.css"; - -/* -Based off of the Ayu theme -Original by Dempfi (https://github.com/dempfi/ayu) -*/ - -.hljs { - display: block; - overflow-x: auto; - background: #191f26; - color: #e6e1cf; -} - -.hljs-comment, -.hljs-quote { - color: #5c6773; - font-style: italic; -} - -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-attr, -.hljs-regexp, -.hljs-link, -.hljs-selector-id, -.hljs-selector-class { - color: #ff7733; -} - -.hljs-number, -.hljs-meta, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #ffee99; -} - -.hljs-string, -.hljs-bullet { - color: #b8cc52; -} - -.hljs-title, -.hljs-built_in, -.hljs-section { - color: #ffb454; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-symbol { - color: #ff7733; -} - -.hljs-name { - color: #36a3d9; -} - -.hljs-tag { - color: #00568d; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #91b362; -} - -.hljs-deletion { - color: #d96c75; -} diff --git a/book/highlight/src/css/overrides.css b/book/highlight/src/css/overrides.css deleted file mode 100644 index 4d4e8c3..0000000 --- a/book/highlight/src/css/overrides.css +++ /dev/null @@ -1,3 +0,0 @@ -pre { - tab-size: 4; -} diff --git a/book/highlight/src/highlight.css b/book/highlight/src/highlight.css deleted file mode 100644 index 6bb7edd..0000000 --- a/book/highlight/src/highlight.css +++ /dev/null @@ -1,84 +0,0 @@ -@import "./css/overrides.css"; - -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/book/highlight/src/highlight.ts b/book/highlight/src/highlight.ts deleted file mode 100644 index be6a3c8..0000000 --- a/book/highlight/src/highlight.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { HLJSOptions } from "highlight.js"; -import hljs from "highlight.js/lib/core"; -import bash from "highlight.js/lib/languages/bash"; -import go from "highlight.js/lib/languages/go"; -import kotlin from "highlight.js/lib/languages/kotlin"; -import python from "highlight.js/lib/languages/python"; -import rust from "highlight.js/lib/languages/rust"; -import toml from "highlight.js/lib/languages/ini"; -import typescript from "highlight.js/lib/languages/typescript"; -import { stef } from "./languages/stef"; - -hljs.registerLanguage("bash", bash); -hljs.registerLanguage("go", go); -hljs.registerLanguage("kotlin", kotlin); -hljs.registerLanguage("python", python); -hljs.registerLanguage("rust", rust); -hljs.registerLanguage("toml", toml); -hljs.registerLanguage("typescript", typescript); - -hljs.registerLanguage("stef", stef); - -export function configure(options: Partial) { - hljs.configure(options); -} - -export function highlightBlock(element: HTMLElement) { - hljs.highlightElement(element); -} diff --git a/book/highlight/src/languages/stef.ts b/book/highlight/src/languages/stef.ts deleted file mode 100644 index b9fad70..0000000 --- a/book/highlight/src/languages/stef.ts +++ /dev/null @@ -1,138 +0,0 @@ -/* -Language: Stef -Author: Dominik Nakamura -Category: common, system -*/ - -import { HLJSApi, Language } from "highlight.js"; - -export function stef(hljs: HLJSApi): Language { - const KEYWORDS = ["mod", "struct", "enum", "const", "type", "use"]; - const LITERALS = ["true", "false"]; - const TYPES = [ - "bool", - "u8", - "u16", - "u32", - "u64", - "u128", - "i8", - "i16", - "i32", - "i64", - "i128", - "f32", - "f64", - "string", - "bytes", - "box", - "vec", - "hash_map", - "hash_set", - "option", - "non_zero", - ]; - return { - name: "Stef", - keywords: { - type: TYPES, - keyword: KEYWORDS, - literal: LITERALS, - }, - illegal: ":,& ]+/, /@\d+/, /,?/], - scope: { - 1: "attr", - 2: "punctuation", - 3: "type", - 4: "symbol", - 5: "punctuation", - }, - relevance: 4, - }, - { - match: [/[a-z0-9_]+/, ":", /[a-zA-Z0-9_<>:,& ]+?/, /,?/], - scope: { - 1: "attr", - 2: "punctuation", - 3: "type", - 4: "punctuation", - }, - relevance: 3, - }, - { - match: [/[a-zA-Z0-9_<>,& ]+/, /@\d+/, /,?/], - scope: { - 1: "type", - 2: "symbol", - 3: "punctuation", - }, - relevance: 2, - }, - { - match: [/[a-zA-Z0-9_<>,& ]+?/, /,?/], - scope: { - 1: "type", - 2: "punctuation", - }, - relevance: 1, - }, - { - match: `${hljs.IDENT_RE}::`, - keywords: { - type: TYPES, - }, - }, - ], - }; -} diff --git a/book/highlight/src/tomorrow-night.css b/book/highlight/src/tomorrow-night.css deleted file mode 100644 index 53e35c5..0000000 --- a/book/highlight/src/tomorrow-night.css +++ /dev/null @@ -1,2 +0,0 @@ -@import "highlight.js/styles/tokyo-night-dark.css"; -@import "./css/overrides.css"; diff --git a/book/package.json b/book/package.json new file mode 100644 index 0000000..d3e87ea --- /dev/null +++ b/book/package.json @@ -0,0 +1,14 @@ +{ + "name": "book", + "private": true, + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview", + "lint": "biome check --apply .vitepress/config.mjs src/**/*.md" + }, + "devDependencies": { + "@biomejs/biome": "^1.4.1", + "vitepress": "^1.0.0-rc.34" + } +} diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md deleted file mode 100644 index b29fe44..0000000 --- a/book/src/SUMMARY.md +++ /dev/null @@ -1,45 +0,0 @@ -# Summary - - - - -[Introduction](introduction.md) -[General idea](general_idea.md) -[Ideas](ideas.md) - ---- - -# User Guide - -- [Installation](guide/installation.md) -- [Creating schemas](guide/creating.md) -- [Generating code](guide/generating.md) -- [Examples](guide/examples.md) - -# Reference Guide - -- [Command Line Interface]() - - [stef init]() - - [stef check]() - - [stef format]() -- [Schema](schema/index.md) - - [Structs](schema/structs.md) - - [Enums](schema/enums.md) - - [Arrays](schema/arrays.md) - - [Tuples](schema/tuples.md) - - [Constants](schema/constants.md) - - [Statics]() - - [Type aliases](schema/type-aliases.md) - - [Modules](schema/modules.md) - - [Imports]() - - [References]() - - [Attributes](schema/attributes.md) -- [Wire format](wire-format/index.md) -- [Compiler]() -- [Generators]() - - [Rust]() - - [Go]() - ---- - -[License](misc/license.md) diff --git a/book/src/cli/index.md b/book/src/cli/index.md deleted file mode 100644 index 93c4278..0000000 --- a/book/src/cli/index.md +++ /dev/null @@ -1 +0,0 @@ -# Command Line Interface diff --git a/book/src/compiler/index.md b/book/src/compiler/index.md deleted file mode 100644 index 88af276..0000000 --- a/book/src/compiler/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Compiler - - diff --git a/book/src/general_idea.md b/book/src/general_idea.md deleted file mode 100644 index 974c27e..0000000 --- a/book/src/general_idea.md +++ /dev/null @@ -1,56 +0,0 @@ -# General idea - -A data format and schema, very similar to Google's Protobuf, but with the full fledged type system of Rust. - -- It should look and feel very close to Rust. Not just the type system, but the way the schema language looks like should resemble it very closely. -- Wire format very close to what `postcard` does, of course with adjustments here and there to include the concepts of Protobuf (like field markers). -- Each language generator should be natively integrated into the language's ecosystem. For example, -for Rust it would be a crate that can generate the code in a `build.rs` file, or for Kotlin it would -be a Gradle plugin. - -## Additions and improvements over Protobuf - -Things that should definitely be added or improved over Protobuf. Also, keep _cap'n proto_ in mind, it has several similar additions like constants and generics. - -- Generics -- Tuples -- Rust enums -- Type aliases -- Full range of integer types and basic Rust types -- Support for borrowed data like `&str` and `&[u8]` that reference into the parsed buffer. -- Support for streamed parsing -- Immutable-ish types like `Box`. -- Shared types like `Rc` / `Arc`, even on the wire level. They'd be put into a global ID to value map and be referenced in the fields. (maybe for later, seems hard to get right?) -- Fields are required by default, marked optional with the `Option` type. -- Rust style attributes for further customization. For example, `#[fixed]` to force an integer field not to be compressed (instead of extra types like `fixed32` in Protobuf). -- Avoid type repetition like all variants of an enum being prefixed with the enum name. Instead, add the prefix in the generator for languages that need it (like C). -- Nesting, exactly like in Rust with modules, but inside of other elements like structs respectively. -- Allow for modules inside a file to further scope and group elements together. -- Constants (maybe?) -- Statics (maybe?) - -## Lending from Cap'n Proto - -These features are concepts from cap'n proto that are missing from Protobuf, and might be interesting to adopt into the new schema language (and aren't listed in the previous section yet). - -- Default values: maybe -- Unions: **NO** (Rust enums solve this) -- Groups: **NO** (Rust enums solve this) -- Interfaces: _probably not_ - - Don't really see the need for this. Not interested in defining interfaces, this is supposed to be a data encoding format after all. Exchanging data, not functionality or contracts. -- Unique IDs: **NO** (never really got the point of those) - -## What about gRPC - -Would recommend people to simply build their own system on top of QUIC, as gRPC is all HTTP/2 under the hood and not as lightweight as it promises to be. - -Eventually as a future plan, could introduce Rust traits that can define services in some form. This might reduce flexibility, but allow to have some convenient thin wrapper over QUIC that reduces boilerplate and can be a solution for simple or common setups. - -## Initial language support - -- Rust (obviously) -- Go -- Kotlin -- Java (automatically through Kotlin, maybe separate generator later) -- TypeScript -- Python (?) diff --git a/book/src/generators/index.md b/book/src/generators/index.md deleted file mode 100644 index a243598..0000000 --- a/book/src/generators/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Generators - - diff --git a/book/src/guide/creating.md b/book/src/guide/creating.md index 57967e4..c23847f 100644 --- a/book/src/guide/creating.md +++ b/book/src/guide/creating.md @@ -1,6 +1,6 @@ # Creating schemas - +[[toc]] ## Create the first schema @@ -8,9 +8,7 @@ Lets jump right in and discover further details along the way. In the following sample we define a simple data structure that describes some details about a user. It holds information about a user's name and age. -```stef -{{#include creating/basic.stef}} -``` +<<< creating/basic.stef Step by step we will disect this schema and explain each part: @@ -27,7 +25,7 @@ It is important to understand built-in data types, as these are used constantly As the name might imply, STEF tries to have a very strong typing system. Therefore, it has a rather large variety of types available. -A full list of all available data types and more specifics can be found in the [schema reference](../schema/index.md). +A full list of all available data types and more specifics can be found in the [schema reference](../reference/schema/). ### Basic types diff --git a/book/src/guide/examples.md b/book/src/guide/examples.md index 9f97f03..801ef87 100644 --- a/book/src/guide/examples.md +++ b/book/src/guide/examples.md @@ -1,5 +1,3 @@ # Examples -```stef -{{#include examples/01.stef}} -``` +<<< ./examples/01.stef diff --git a/book/src/guide/generating.md b/book/src/guide/generating.md index cd38062..5aef931 100644 --- a/book/src/guide/generating.md +++ b/book/src/guide/generating.md @@ -1,10 +1,10 @@ # Generating code - +[[toc]] ## Rust -First, make sure you followed the [installation](./installation.md#rust) instructions, to setup the dependencies in your _Cargo.toml_ properly. +First, make sure you followed the [installation](./installation#rust) instructions, to setup the dependencies in your _Cargo.toml_ properly. The main entry point is the `stef-build` crate, which you use as build script in your `build.rs` file. A basic setup looks like this, assuming you have a single schema under `src/sample.stef`: diff --git a/book/src/guide/index.md b/book/src/guide/index.md new file mode 100644 index 0000000..cd3d452 --- /dev/null +++ b/book/src/guide/index.md @@ -0,0 +1 @@ +# User Guide diff --git a/book/src/guide/installation.md b/book/src/guide/installation.md index d167055..a4b7773 100644 --- a/book/src/guide/installation.md +++ b/book/src/guide/installation.md @@ -1,6 +1,6 @@ # Installation - +[[toc]] ## Command Line Interface diff --git a/book/src/ideas.md b/book/src/ideas.md index 1c609c0..a218fa1 100644 --- a/book/src/ideas.md +++ b/book/src/ideas.md @@ -2,6 +2,8 @@ The following are general ideas for this project, that are not yet implemented or even close to being developed, but definitely on the list of ideas for the future. +[[toc]] + ## Documentation generator Similar to Rust's [rustdoc](https://doc.rust-lang.org/rustdoc/index.html), it would be nice to have a documentation generator built in. The doc comments can be extended to be parsed as Markdown and allow for rich formatting in the docs. diff --git a/book/src/index.md b/book/src/index.md new file mode 100644 index 0000000..a4ece05 --- /dev/null +++ b/book/src/index.md @@ -0,0 +1,48 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "Stef" + text: "Strongly Typed Encoding Format" + tagline: Data format and schema, with a type system as strong as Rust's + image: + src: /logo.svg + alt: Stef + actions: + - theme: brand + text: User Guide + link: /guide/ + - theme: alt + text: Reference + link: /reference/ + +features: + - icon: 🦀 + title: Type safe + details: Strongly typed schemas with a type system like Rust's. + - icon: 🧰 + title: Rich tooling + details: Ships with many tools like formatter, linter and documentation generator and more. +--- + diff --git a/book/src/misc/team.md b/book/src/misc/team.md new file mode 100644 index 0000000..3d02e3e --- /dev/null +++ b/book/src/misc/team.md @@ -0,0 +1,38 @@ +--- +layout: page +--- + + + + + + + + + diff --git a/book/src/public/logo.svg b/book/src/public/logo.svg new file mode 100644 index 0000000..f9606ac --- /dev/null +++ b/book/src/public/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/book/src/schema/references/basic.stef b/book/src/reference/cli/check.md similarity index 100% rename from book/src/schema/references/basic.stef rename to book/src/reference/cli/check.md diff --git a/book/src/reference/cli/format.md b/book/src/reference/cli/format.md new file mode 100644 index 0000000..e69de29 diff --git a/book/src/reference/cli/index.md b/book/src/reference/cli/index.md new file mode 100644 index 0000000..e69de29 diff --git a/book/src/reference/cli/lint.md b/book/src/reference/cli/lint.md new file mode 100644 index 0000000..e69de29 diff --git a/book/src/reference/index.md b/book/src/reference/index.md new file mode 100644 index 0000000..cf5aa07 --- /dev/null +++ b/book/src/reference/index.md @@ -0,0 +1 @@ +# Reference diff --git a/book/src/reference/schema/arrays.md b/book/src/reference/schema/arrays.md new file mode 100644 index 0000000..2650432 --- /dev/null +++ b/book/src/reference/schema/arrays.md @@ -0,0 +1,17 @@ +# Arrays + +[[toc]] + +## Schema + +<<< arrays/basic.stef + +## Languages + +::: code-group +<<< arrays/basic.rs#snippet [Rust] +<<< arrays/basic.go#snippet [Go] +<<< arrays/basic.kt#snippet [Kotlin] +<<< arrays/basic.ts#snippet [TypeScript] +<<< arrays/basic.py#snippet [Python] +::: diff --git a/book/src/schema/arrays/basic.go b/book/src/reference/schema/arrays/basic.go similarity index 62% rename from book/src/schema/arrays/basic.go rename to book/src/reference/schema/arrays/basic.go index 59b6fe3..bc195cd 100644 --- a/book/src/schema/arrays/basic.go +++ b/book/src/reference/schema/arrays/basic.go @@ -2,6 +2,9 @@ package main func main() {} +// #region snippet type Sample struct { Options [5]bool } + +// #endregion snippet diff --git a/book/src/schema/arrays/basic.kt b/book/src/reference/schema/arrays/basic.kt similarity index 62% rename from book/src/schema/arrays/basic.kt rename to book/src/reference/schema/arrays/basic.kt index 02e6d32..eb79b96 100644 --- a/book/src/schema/arrays/basic.kt +++ b/book/src/reference/schema/arrays/basic.kt @@ -1,5 +1,7 @@ fun main() {} +// #region snippet data class Sample( val options: Array, ) +// #endregion snippet diff --git a/book/src/schema/arrays/basic.py b/book/src/reference/schema/arrays/basic.py similarity index 68% rename from book/src/schema/arrays/basic.py rename to book/src/reference/schema/arrays/basic.py index 9191d56..2ca21ae 100644 --- a/book/src/schema/arrays/basic.py +++ b/book/src/reference/schema/arrays/basic.py @@ -1,6 +1,10 @@ from dataclasses import dataclass +# region snippet @dataclass class Sample: options: list[bool] + + +# endregion snippet diff --git a/book/src/schema/arrays/basic.rs b/book/src/reference/schema/arrays/basic.rs similarity index 100% rename from book/src/schema/arrays/basic.rs rename to book/src/reference/schema/arrays/basic.rs diff --git a/book/src/schema/arrays/basic.stef b/book/src/reference/schema/arrays/basic.stef similarity index 100% rename from book/src/schema/arrays/basic.stef rename to book/src/reference/schema/arrays/basic.stef diff --git a/book/src/schema/arrays/basic.ts b/book/src/reference/schema/arrays/basic.ts similarity index 100% rename from book/src/schema/arrays/basic.ts rename to book/src/reference/schema/arrays/basic.ts diff --git a/book/src/schema/attributes.md b/book/src/reference/schema/attributes.md similarity index 98% rename from book/src/schema/attributes.md rename to book/src/reference/schema/attributes.md index c7fac6f..79769f0 100644 --- a/book/src/schema/attributes.md +++ b/book/src/reference/schema/attributes.md @@ -4,7 +4,7 @@ The attributes allow to further apply configuration to elements, while not affec For example, they allow to mark elements as _deprecated_ or define how a certain value is represented in code, off the default variant. - +[[toc]] ## Schema diff --git a/book/src/schema/constants.md b/book/src/reference/schema/constants.md similarity index 51% rename from book/src/schema/constants.md rename to book/src/reference/schema/constants.md index 1edd8ab..329f9e3 100644 --- a/book/src/schema/constants.md +++ b/book/src/reference/schema/constants.md @@ -1,7 +1,6 @@ # Constants - - +[[toc]] | Language | Example | | ------------- | ------------------------------- | @@ -13,38 +12,14 @@ ## Schema -```stef -{{#include constants/basic.stef}} -``` +<<< constants/basic.stef ## Languages -### Rust - -```rust -{{#include constants/basic.rs}} -``` - -### Go - -```go -{{#include constants/basic.go:7:}} -``` - -### Kotlin - -```kotlin -{{#include constants/basic.kt:3:}} -``` - -### TypeScript - -```typescript -{{#include constants/basic.ts}} -``` - -### Python - -```python -{{#include constants/basic.py}} -``` +::: code-group +<<< constants/basic.rs#snippet [Rust] +<<< constants/basic.go#snippet [Go] +<<< constants/basic.kt#snippet [Kotlin] +<<< constants/basic.ts#snippet [TypeScript] +<<< constants/basic.py#snippet [Python] +::: diff --git a/book/src/schema/constants/basic.go b/book/src/reference/schema/constants/basic.go similarity index 91% rename from book/src/schema/constants/basic.go rename to book/src/reference/schema/constants/basic.go index 9bf4e3e..608fad4 100644 --- a/book/src/schema/constants/basic.go +++ b/book/src/reference/schema/constants/basic.go @@ -4,6 +4,7 @@ import "math/big" func main() {} +// #region snippet const ( ValueBool bool = true @@ -28,3 +29,5 @@ var ( ValueI128 *big.Int = big.NewInt(-5) ValueBytes []byte = []byte{1, 2, 3} ) + +// #endregion snippet diff --git a/book/src/schema/constants/basic.kt b/book/src/reference/schema/constants/basic.kt similarity index 93% rename from book/src/schema/constants/basic.kt rename to book/src/reference/schema/constants/basic.kt index 474f4cc..0829a00 100644 --- a/book/src/schema/constants/basic.kt +++ b/book/src/reference/schema/constants/basic.kt @@ -2,6 +2,7 @@ import java.math.BigInteger fun main() {} +// #region snippet const val VALUE_BOOL: Boolean = true const val VALUE_U8: UByte = 1u @@ -22,3 +23,4 @@ const val VALUE_STR: String = "abc" val VALUE_U128: BigInteger = BigInteger.valueOf(5) val VALUE_I128: BigInteger = BigInteger.valueOf(-5) val VALUE_BYTES: ByteArray = byteArrayOf(1, 2, 3) +// #endregion snippet diff --git a/book/src/schema/constants/basic.py b/book/src/reference/schema/constants/basic.py similarity index 100% rename from book/src/schema/constants/basic.py rename to book/src/reference/schema/constants/basic.py diff --git a/book/src/schema/constants/basic.rs b/book/src/reference/schema/constants/basic.rs similarity index 100% rename from book/src/schema/constants/basic.rs rename to book/src/reference/schema/constants/basic.rs diff --git a/book/src/schema/constants/basic.stef b/book/src/reference/schema/constants/basic.stef similarity index 100% rename from book/src/schema/constants/basic.stef rename to book/src/reference/schema/constants/basic.stef diff --git a/book/src/schema/constants/basic.ts b/book/src/reference/schema/constants/basic.ts similarity index 100% rename from book/src/schema/constants/basic.ts rename to book/src/reference/schema/constants/basic.ts diff --git a/book/src/reference/schema/enums.md b/book/src/reference/schema/enums.md new file mode 100644 index 0000000..2ee9eab --- /dev/null +++ b/book/src/reference/schema/enums.md @@ -0,0 +1,35 @@ +# Enums + +[[toc]] + +## Basic + +### Schema {#basic-schema} + +<<< enums/basic.stef + +### Languages {#basic-lang} + +::: code-group +<<< enums/basic.rs#snippet [Rust] +<<< enums/basic.go#snippet [Go] +<<< enums/basic.kt#snippet [Kotlin] +<<< enums/basic.ts#snippet [TypeScript] +<<< enums/basic.py#snippet [Python] +::: + +## Advanced + +### Schema {#advanced-schema} + +<<< enums/advanced.stef + +### Languages {#advanced-lang} + +::: code-group +<<< enums/advanced.rs#snippet [Rust] +<<< enums/advanced.go#snippet [Go] +<<< enums/advanced.kt#snippet [Kotlin] +<<< enums/advanced.ts#snippet [TypeScript] +<<< enums/advanced.py#snippet [Python] +::: diff --git a/book/src/schema/enums/advanced.go b/book/src/reference/schema/enums/advanced.go similarity index 88% rename from book/src/schema/enums/advanced.go rename to book/src/reference/schema/enums/advanced.go index 63e7fbb..5218272 100644 --- a/book/src/schema/enums/advanced.go +++ b/book/src/reference/schema/enums/advanced.go @@ -2,6 +2,7 @@ package main func main() {} +// #region snippet type SampleVariant interface { sealed() } @@ -23,3 +24,4 @@ type Sample_Variant2 struct { func (v Sample_Variant2) sealed() {} // N variants... +// #endregion snippet diff --git a/book/src/schema/enums/advanced.kt b/book/src/reference/schema/enums/advanced.kt similarity index 85% rename from book/src/schema/enums/advanced.kt rename to book/src/reference/schema/enums/advanced.kt index 748aa0d..5eff2fb 100644 --- a/book/src/schema/enums/advanced.kt +++ b/book/src/reference/schema/enums/advanced.kt @@ -1,5 +1,6 @@ fun main() {} +// #region snippet sealed class Sample { class Variant1( val f1: UInt, @@ -13,3 +14,4 @@ sealed class Sample { // N variants... } +// #endregion snippet diff --git a/book/src/schema/enums/advanced.py b/book/src/reference/schema/enums/advanced.py similarity index 88% rename from book/src/schema/enums/advanced.py rename to book/src/reference/schema/enums/advanced.py index fd3d6cf..b8f71f6 100644 --- a/book/src/schema/enums/advanced.py +++ b/book/src/reference/schema/enums/advanced.py @@ -2,6 +2,7 @@ from typing import Literal +# region snippet @dataclass class SampleVariant1: tag: Literal["Variant1"] @@ -16,4 +17,7 @@ class SampleVariant2: field2: bool +# endregion snippet + + Sample = SampleVariant1 | SampleVariant2 diff --git a/book/src/schema/enums/advanced.rs b/book/src/reference/schema/enums/advanced.rs similarity index 100% rename from book/src/schema/enums/advanced.rs rename to book/src/reference/schema/enums/advanced.rs diff --git a/book/src/schema/enums/advanced.stef b/book/src/reference/schema/enums/advanced.stef similarity index 100% rename from book/src/schema/enums/advanced.stef rename to book/src/reference/schema/enums/advanced.stef diff --git a/book/src/schema/enums/advanced.ts b/book/src/reference/schema/enums/advanced.ts similarity index 100% rename from book/src/schema/enums/advanced.ts rename to book/src/reference/schema/enums/advanced.ts diff --git a/book/src/schema/enums/basic.go b/book/src/reference/schema/enums/basic.go similarity index 75% rename from book/src/schema/enums/basic.go rename to book/src/reference/schema/enums/basic.go index 35a4c01..71e6bbb 100644 --- a/book/src/schema/enums/basic.go +++ b/book/src/reference/schema/enums/basic.go @@ -2,6 +2,7 @@ package main func main() {} +// #region snippet type Sample uint32 const ( @@ -9,3 +10,5 @@ const ( SampleVariant2 Sample = 2 // N variants... ) + +// #endregion snippet diff --git a/book/src/schema/enums/basic.kt b/book/src/reference/schema/enums/basic.kt similarity index 72% rename from book/src/schema/enums/basic.kt rename to book/src/reference/schema/enums/basic.kt index a8da07c..b7bee69 100644 --- a/book/src/schema/enums/basic.kt +++ b/book/src/reference/schema/enums/basic.kt @@ -1,7 +1,9 @@ fun main() {} +// #region snippet enum class Sample(val value: Int) { Variant1(1), Variant2(2), // N variants... } +// #endregion snippet diff --git a/book/src/schema/enums/basic.py b/book/src/reference/schema/enums/basic.py similarity index 75% rename from book/src/schema/enums/basic.py rename to book/src/reference/schema/enums/basic.py index 946ca58..636e1af 100644 --- a/book/src/schema/enums/basic.py +++ b/book/src/reference/schema/enums/basic.py @@ -2,7 +2,11 @@ from enum import Enum +# region snippet @dataclass class Sample(Enum): VARIANT1 = 1 VARIANT2 = 2 + + +# endregion snippet diff --git a/book/src/schema/enums/basic.rs b/book/src/reference/schema/enums/basic.rs similarity index 100% rename from book/src/schema/enums/basic.rs rename to book/src/reference/schema/enums/basic.rs diff --git a/book/src/schema/enums/basic.stef b/book/src/reference/schema/enums/basic.stef similarity index 100% rename from book/src/schema/enums/basic.stef rename to book/src/reference/schema/enums/basic.stef diff --git a/book/src/schema/enums/basic.ts b/book/src/reference/schema/enums/basic.ts similarity index 100% rename from book/src/schema/enums/basic.ts rename to book/src/reference/schema/enums/basic.ts diff --git a/book/src/reference/schema/imports.md b/book/src/reference/schema/imports.md new file mode 100644 index 0000000..0fcf3b0 --- /dev/null +++ b/book/src/reference/schema/imports.md @@ -0,0 +1,7 @@ +# Imports + +[[toc]] + +## Schema + +<<< imports/basic.stef diff --git a/book/src/schema/imports/basic.stef b/book/src/reference/schema/imports/basic.stef similarity index 100% rename from book/src/schema/imports/basic.stef rename to book/src/reference/schema/imports/basic.stef diff --git a/book/src/schema/index.md b/book/src/reference/schema/index.md similarity index 98% rename from book/src/schema/index.md rename to book/src/reference/schema/index.md index 7ba35ed..e194434 100644 --- a/book/src/schema/index.md +++ b/book/src/reference/schema/index.md @@ -2,7 +2,7 @@ Schemas are an essential part of STEF. They define the structure of the data, and thus, how to en- and decode to or from the raw bytes. - +[[toc]] ## Type mapping @@ -148,7 +148,7 @@ Byte arrays are mutable in other languages as well, but they don't have a reason Identifier are an integral part of schemas and are attached to named and unnamed fields inside a struct or enum. -As the wire format doesn't contain any field names, fields have to be identified in some way. This is done by identifiers, which are [varint](../wire-format/index.md#varint-encoding) encoded integers. +As the wire format doesn't contain any field names, fields have to be identified in some way. This is done by identifiers, which are [varint](../wire-format#varint-encoding) encoded integers. ## Naming diff --git a/book/src/reference/schema/modules.md b/book/src/reference/schema/modules.md new file mode 100644 index 0000000..cda25e7 --- /dev/null +++ b/book/src/reference/schema/modules.md @@ -0,0 +1,13 @@ +# Modules + +[[toc]] + +## Schema + +<<< modules/basic.stef + +## Nesting + +### Schema {#nesting-schema} + +<<< modules/nesting.stef diff --git a/book/src/schema/modules/basic.stef b/book/src/reference/schema/modules/basic.stef similarity index 100% rename from book/src/schema/modules/basic.stef rename to book/src/reference/schema/modules/basic.stef diff --git a/book/src/schema/modules/nesting.stef b/book/src/reference/schema/modules/nesting.stef similarity index 100% rename from book/src/schema/modules/nesting.stef rename to book/src/reference/schema/modules/nesting.stef diff --git a/book/src/reference/schema/references.md b/book/src/reference/schema/references.md new file mode 100644 index 0000000..a590b76 --- /dev/null +++ b/book/src/reference/schema/references.md @@ -0,0 +1,7 @@ +# References + +[[toc]] + +## Schema + +<<< references/basic.stef diff --git a/book/src/reference/schema/references/basic.stef b/book/src/reference/schema/references/basic.stef new file mode 100644 index 0000000..e69de29 diff --git a/book/src/reference/schema/statics.md b/book/src/reference/schema/statics.md new file mode 100644 index 0000000..d07fdcd --- /dev/null +++ b/book/src/reference/schema/statics.md @@ -0,0 +1,3 @@ +# Statics + +[[toc]] diff --git a/book/src/schema/structs.md b/book/src/reference/schema/structs.md similarity index 63% rename from book/src/schema/structs.md rename to book/src/reference/schema/structs.md index 9d0d721..4c0a691 100644 --- a/book/src/schema/structs.md +++ b/book/src/reference/schema/structs.md @@ -10,8 +10,7 @@ Note that acronyms should be written in strict _CamelCase_, meaning `Html` inste Individual fields in both named and unnamed form are separated by a comma `,`, and it's recommended to even give the last field a trailing comma. This allows for simpler diffs in version control systems. - - +[[toc]] ## Named @@ -21,56 +20,42 @@ To declare the struct as named the content is contained in curly braces `{...}`. A single field is defined as `name: type @id`, the name, its type and [ID]. Field names must start with a lowercase ASCII character (`a-z`) and _may_ be followed by zero or more lowercase ASCII characters, digits and underscores (`a-z`, `0-9`, `_`). -[ID]: ./index.md#identifiers +[ID]: ./#identifiers ### Schema {#named-schema} Here is a basic named schema with two fields `field1` and `field2`. The first one is a 32-bit unsigned integer and assigned the ID 1. The second one is a 16-bit unsigned integer and assigned the ID 2. -```stef -{{#include structs/named.stef}} -``` +<<< structs/named.stef ### Languages {#named-lang} These samples describe how the schema would be defined in each language, when generating the code for it. -#### Rust {#named-lang-rs} +::: code-group +<<< structs/named.rs#snippet [Rust] +<<< structs/named.go#snippet [Go] +<<< structs/named.kt#snippet [Kotlin] +<<< structs/named.ts#snippet [TypeScript] +<<< structs/named.py#snippet [Python] +::: -```rust -{{#include structs/named.rs}} -``` +#### Rust {#named-lang-rs} #### Go {#named-lang-go} As Go allows to create new instances without declaring a value for each field (they default to the zero value), an additional constructor is created. -```go -{{#include structs/named.go:5:}} -``` - #### Kotlin {#named-lang-kt} -```kotlin -{{#include structs/named.kt:3:}} -``` - #### TypeScript {#named-lang-ts} An additional constructor is required, to ensure all fields are properly initialized when creating new instances. -```typescript -{{#include structs/named.ts}} -``` - #### Python {#named-lang-py} In Python the `@dataclass` attribute is used to define the fields of a class. -```python -{{#include structs/named.py:5:}} -``` - ## Unnamed This variant is very similar to named structs, but in contrast lack a field name. They can be convenient if the data type is rather compact and explicit field names aren't needed. For example a position with the horizontal and vertical offset. @@ -79,43 +64,21 @@ To declare the struct as unnamed the content is contained in parenthesis `(...)` A single field is defined as `type @id`, the name and [ID]. -### Schema #{unnamed-schema} - -```stef -{{#include structs/unnamed.stef}} -``` - -### Languages #{unnamed-lang} - -#### Rust {#unnamed-lang-rs} +### Schema {#unnamed-schema} -```rust -{{#include structs/unnamed.rs}} -``` +<<< structs/unnamed.stef -#### Go {#unnamed-lang-go} +### Languages {#unnamed-lang} -```go -{{#include structs/unnamed.go:5:}} -``` - -#### Kotlin {#unnamed-lang-kt} - -```kotlin -{{#include structs/unnamed.kt:3:}} -``` - -#### TypeScript {#unnamed-lang-ts} - -```typescript -{{#include structs/unnamed.ts}} -``` - -#### Python {#unnamed-lang-py} +These samples describe how the schema would be defined in each language, when generating the code for it. -```python -{{#include structs/unnamed.py:4:}} -``` +::: code-group +<<< structs/unnamed.rs#snippet [Rust] +<<< structs/unnamed.go#snippet [Go] +<<< structs/unnamed.kt#snippet [Kotlin] +<<< structs/unnamed.ts#snippet [TypeScript] +<<< structs/unnamed.py#snippet [Python] +::: ## Unit @@ -127,78 +90,34 @@ Instead, it's only the type that carries information. ### Schema {#unit-schema} -```stef -{{#include structs/unit.stef}} -``` +<<< structs/unit.stef ### Languages {#unit-lang} -#### Rust {#unit-lang-rs} - -```rust -{{#include structs/unit.rs}} -``` - -#### Go {#unit-lang-go} - -```go -{{#include structs/unit.go:5:}} -``` - -#### Kotlin {#unit-lang-kt} - -```kotlin -{{#include structs/unit.kt:3:}} -``` - -#### TypeScript {#unit-lang-ts} - -```typescript -{{#include structs/unit.ts}} -``` - -#### Python {#unit-lang-py} +These samples describe how the schema would be defined in each language, when generating the code for it. -```python -{{#include structs/unit.py:4:}} -``` +::: code-group +<<< structs/unit.rs#snippet [Rust] +<<< structs/unit.go#snippet [Go] +<<< structs/unit.kt#snippet [Kotlin] +<<< structs/unit.ts#snippet [TypeScript] +<<< structs/unit.py#snippet [Python] +::: ## Generics ### Schema {#generics-schema} -```stef -{{#include structs/generics.stef}} -``` +<<< structs/generics.stef ### Languages {#generics-lang} -#### Rust {#generics-lang-rs} - -```rust -{{#include structs/generics.rs}} -``` - -#### Go {#generics-lang-go} - -```go -{{#include structs/generics.go:5:}} -``` - -#### Kotlin {#generics-lang-kt} - -```kotlin -{{#include structs/generics.kt:3:}} -``` - -#### TypeScript {#generics-lang-ts} - -```typescript -{{#include structs/generics.ts}} -``` - -#### Python {#generics-lang-py} +These samples describe how the schema would be defined in each language, when generating the code for it. -```python -{{#include structs/generics.py:5:}} -``` +::: code-group +<<< structs/generics.rs#snippet [Rust] +<<< structs/generics.go#snippet [Go] +<<< structs/generics.kt#snippet [Kotlin] +<<< structs/generics.ts#snippet [TypeScript] +<<< structs/generics.py#snippet [Python] +::: diff --git a/book/src/schema/structs/generics.go b/book/src/reference/schema/structs/generics.go similarity index 66% rename from book/src/schema/structs/generics.go rename to book/src/reference/schema/structs/generics.go index 0c6b0e1..b3040ab 100644 --- a/book/src/schema/structs/generics.go +++ b/book/src/reference/schema/structs/generics.go @@ -2,7 +2,10 @@ package main func main() {} +// #region snippet type Pair[K any, V any] struct { Key K Value V } + +// #endregion snippet diff --git a/book/src/schema/structs/generics.kt b/book/src/reference/schema/structs/generics.kt similarity index 64% rename from book/src/schema/structs/generics.kt rename to book/src/reference/schema/structs/generics.kt index a2a2612..2d8fd5a 100644 --- a/book/src/schema/structs/generics.kt +++ b/book/src/reference/schema/structs/generics.kt @@ -1,6 +1,8 @@ fun main() {} +// #region snippet data class Pair( val key: K, val value: V, ) +// #endregion snippet diff --git a/book/src/schema/structs/generics.py b/book/src/reference/schema/structs/generics.py similarity index 81% rename from book/src/schema/structs/generics.py rename to book/src/reference/schema/structs/generics.py index 1c69c9c..f19064b 100644 --- a/book/src/schema/structs/generics.py +++ b/book/src/reference/schema/structs/generics.py @@ -1,7 +1,7 @@ from dataclasses import dataclass from typing import Generic, TypeVar - +# region snippet K = TypeVar("K") V = TypeVar("V") @@ -10,3 +10,6 @@ class Pair(Generic[K, V]): key: K value: V + + +# endregion snippet diff --git a/book/src/schema/structs/generics.rs b/book/src/reference/schema/structs/generics.rs similarity index 100% rename from book/src/schema/structs/generics.rs rename to book/src/reference/schema/structs/generics.rs diff --git a/book/src/schema/structs/generics.stef b/book/src/reference/schema/structs/generics.stef similarity index 100% rename from book/src/schema/structs/generics.stef rename to book/src/reference/schema/structs/generics.stef diff --git a/book/src/schema/structs/generics.ts b/book/src/reference/schema/structs/generics.ts similarity index 100% rename from book/src/schema/structs/generics.ts rename to book/src/reference/schema/structs/generics.ts diff --git a/book/src/schema/structs/named.go b/book/src/reference/schema/structs/named.go similarity index 83% rename from book/src/schema/structs/named.go rename to book/src/reference/schema/structs/named.go index 750b9b9..05582ce 100644 --- a/book/src/schema/structs/named.go +++ b/book/src/reference/schema/structs/named.go @@ -2,6 +2,7 @@ package main func main() {} +// #region snippet type Sample struct { Field1 uint32 Field2 uint16 @@ -14,3 +15,5 @@ func NewSample(field1 uint32, field2 uint16) Sample { Field2: field2, } } + +// #endregion snippet diff --git a/book/src/schema/structs/named.kt b/book/src/reference/schema/structs/named.kt similarity index 71% rename from book/src/schema/structs/named.kt rename to book/src/reference/schema/structs/named.kt index 75191d1..8ff33b2 100644 --- a/book/src/schema/structs/named.kt +++ b/book/src/reference/schema/structs/named.kt @@ -1,7 +1,9 @@ fun main() {} +// #region snippet data class Sample( val field1: UInt, val field2: UShort, // N fields... ) +// #endregion snippet diff --git a/book/src/schema/structs/named.py b/book/src/reference/schema/structs/named.py similarity index 75% rename from book/src/schema/structs/named.py rename to book/src/reference/schema/structs/named.py index 81ce53e..fbb0209 100644 --- a/book/src/schema/structs/named.py +++ b/book/src/reference/schema/structs/named.py @@ -2,7 +2,11 @@ from typing import TypedDict +# region snippet @dataclass class Sample: field1: int field2: int + + +# endregion snippet diff --git a/book/src/schema/structs/named.rs b/book/src/reference/schema/structs/named.rs similarity index 100% rename from book/src/schema/structs/named.rs rename to book/src/reference/schema/structs/named.rs diff --git a/book/src/schema/structs/named.stef b/book/src/reference/schema/structs/named.stef similarity index 100% rename from book/src/schema/structs/named.stef rename to book/src/reference/schema/structs/named.stef diff --git a/book/src/schema/structs/named.ts b/book/src/reference/schema/structs/named.ts similarity index 100% rename from book/src/schema/structs/named.ts rename to book/src/reference/schema/structs/named.ts diff --git a/book/src/schema/structs/unit.go b/book/src/reference/schema/structs/unit.go similarity index 54% rename from book/src/schema/structs/unit.go rename to book/src/reference/schema/structs/unit.go index 52a7d37..dd439c5 100644 --- a/book/src/schema/structs/unit.go +++ b/book/src/reference/schema/structs/unit.go @@ -2,4 +2,7 @@ package main func main() {} +// #region snippet type Sample struct{} + +// #endregion snippet diff --git a/book/src/reference/schema/structs/unit.kt b/book/src/reference/schema/structs/unit.kt new file mode 100644 index 0000000..b7a191d --- /dev/null +++ b/book/src/reference/schema/structs/unit.kt @@ -0,0 +1,5 @@ +fun main() {} + +// #region snippet +class Sample +// #endregion snippet diff --git a/book/src/schema/structs/unit.py b/book/src/reference/schema/structs/unit.py similarity index 64% rename from book/src/schema/structs/unit.py rename to book/src/reference/schema/structs/unit.py index 112a814..0e54bd4 100644 --- a/book/src/schema/structs/unit.py +++ b/book/src/reference/schema/structs/unit.py @@ -1,6 +1,10 @@ from dataclasses import dataclass +# region snippet @dataclass class Sample: pass + + +# endregion snippet diff --git a/book/src/schema/structs/unit.rs b/book/src/reference/schema/structs/unit.rs similarity index 100% rename from book/src/schema/structs/unit.rs rename to book/src/reference/schema/structs/unit.rs diff --git a/book/src/schema/structs/unit.stef b/book/src/reference/schema/structs/unit.stef similarity index 100% rename from book/src/schema/structs/unit.stef rename to book/src/reference/schema/structs/unit.stef diff --git a/book/src/schema/structs/unit.ts b/book/src/reference/schema/structs/unit.ts similarity index 100% rename from book/src/schema/structs/unit.ts rename to book/src/reference/schema/structs/unit.ts diff --git a/book/src/schema/structs/unnamed.go b/book/src/reference/schema/structs/unnamed.go similarity index 79% rename from book/src/schema/structs/unnamed.go rename to book/src/reference/schema/structs/unnamed.go index 48b405b..ee4d181 100644 --- a/book/src/schema/structs/unnamed.go +++ b/book/src/reference/schema/structs/unnamed.go @@ -2,6 +2,7 @@ package main func main() {} +// #region snippet type Sample struct { F1 uint32 F2 uint16 @@ -13,3 +14,5 @@ func NewSample(f1 uint32, f2 uint16) Sample { F2: f2, } } + +// #endregion snippet diff --git a/book/src/schema/structs/unnamed.kt b/book/src/reference/schema/structs/unnamed.kt similarity index 64% rename from book/src/schema/structs/unnamed.kt rename to book/src/reference/schema/structs/unnamed.kt index 3f7a8df..9f50737 100644 --- a/book/src/schema/structs/unnamed.kt +++ b/book/src/reference/schema/structs/unnamed.kt @@ -1,6 +1,8 @@ fun main() {} +// #region snippet data class Sample( val f1: UInt, val f2: UShort, ) +// #endregion snippet diff --git a/book/src/schema/structs/unnamed.py b/book/src/reference/schema/structs/unnamed.py similarity index 69% rename from book/src/schema/structs/unnamed.py rename to book/src/reference/schema/structs/unnamed.py index 9f587d1..dd03692 100644 --- a/book/src/schema/structs/unnamed.py +++ b/book/src/reference/schema/structs/unnamed.py @@ -1,6 +1,10 @@ from dataclasses import dataclass +# region snippet @dataclass class Sample(tuple[int, int]): pass + + +# endregion snippet diff --git a/book/src/schema/structs/unnamed.rs b/book/src/reference/schema/structs/unnamed.rs similarity index 100% rename from book/src/schema/structs/unnamed.rs rename to book/src/reference/schema/structs/unnamed.rs diff --git a/book/src/schema/structs/unnamed.stef b/book/src/reference/schema/structs/unnamed.stef similarity index 100% rename from book/src/schema/structs/unnamed.stef rename to book/src/reference/schema/structs/unnamed.stef diff --git a/book/src/schema/structs/unnamed.ts b/book/src/reference/schema/structs/unnamed.ts similarity index 100% rename from book/src/schema/structs/unnamed.ts rename to book/src/reference/schema/structs/unnamed.ts diff --git a/book/src/schema/tuples.md b/book/src/reference/schema/tuples.md similarity index 82% rename from book/src/schema/tuples.md rename to book/src/reference/schema/tuples.md index 60eda45..80f2fd9 100644 --- a/book/src/schema/tuples.md +++ b/book/src/reference/schema/tuples.md @@ -1,7 +1,6 @@ # Tuples - - +[[toc]] Tuples allow for the definition of a set of types, without having to define an explicit struct for it. These do not have any associated [ID](index.md#identifiers), meaning the order of declaration matters, and any modification to the type definition is generally incompatible. @@ -15,48 +14,34 @@ The minimum amount of types in a tuple are **2** and the maximum are **12**. Rea In the schema, tuples are declared with parenthesis `(` and `)`, each type separated by a comma `,`, forming a definition like `(T1, T2, TN...)`. -```stef -{{#include tuples/basic.stef}} -``` +<<( val f1: T1, val f2: T2, @@ -18,3 +19,4 @@ data class Tuple3( data class Sample( val size: Tuple2, ) +// #endregion snippet diff --git a/book/src/schema/tuples/basic.py b/book/src/reference/schema/tuples/basic.py similarity index 69% rename from book/src/schema/tuples/basic.py rename to book/src/reference/schema/tuples/basic.py index c6dee7f..0e71c6b 100644 --- a/book/src/schema/tuples/basic.py +++ b/book/src/reference/schema/tuples/basic.py @@ -1,6 +1,10 @@ from dataclasses import dataclass +# region snippet @dataclass class Sample: size: tuple[int, int] + + +# endregion snippet diff --git a/book/src/schema/tuples/basic.rs b/book/src/reference/schema/tuples/basic.rs similarity index 100% rename from book/src/schema/tuples/basic.rs rename to book/src/reference/schema/tuples/basic.rs diff --git a/book/src/schema/tuples/basic.stef b/book/src/reference/schema/tuples/basic.stef similarity index 100% rename from book/src/schema/tuples/basic.stef rename to book/src/reference/schema/tuples/basic.stef diff --git a/book/src/schema/tuples/basic.ts b/book/src/reference/schema/tuples/basic.ts similarity index 100% rename from book/src/schema/tuples/basic.ts rename to book/src/reference/schema/tuples/basic.ts diff --git a/book/src/reference/schema/type-aliases.md b/book/src/reference/schema/type-aliases.md new file mode 100644 index 0000000..d5e623c --- /dev/null +++ b/book/src/reference/schema/type-aliases.md @@ -0,0 +1,25 @@ +# Type aliases + +[[toc]] + +| Language | Example | +| ------------- | ------------------ | +| Schema / Rust | `type A = T;` | +| Go | `type A = T` | +| Kotlin | `typealias A = T` | +| TypeScript | `type A = T;` | +| Python | `A: TypeAlias = T` | + +## Schema + +<<< type-aliases/basic.stef + +## Languages + +::: code-group +<<< type-aliases/basic.rs#snippet [Rust] +<<< type-aliases/basic.go#snippet [Go] +<<< type-aliases/basic.kt#snippet [Kotlin] +<<< type-aliases/basic.ts#snippet [TypeScript] +<<< type-aliases/basic.py#snippet [Python] +::: diff --git a/book/src/schema/type-aliases/basic.go b/book/src/reference/schema/type-aliases/basic.go similarity index 63% rename from book/src/schema/type-aliases/basic.go rename to book/src/reference/schema/type-aliases/basic.go index dbc5695..fda9fb8 100644 --- a/book/src/schema/type-aliases/basic.go +++ b/book/src/reference/schema/type-aliases/basic.go @@ -2,6 +2,9 @@ package main func main() {} +// #region snippet type Sample struct{} type Other = Sample + +// #endregion snippet diff --git a/book/src/schema/type-aliases/basic.kt b/book/src/reference/schema/type-aliases/basic.kt similarity index 56% rename from book/src/schema/type-aliases/basic.kt rename to book/src/reference/schema/type-aliases/basic.kt index f7e70c4..f3460fe 100644 --- a/book/src/schema/type-aliases/basic.kt +++ b/book/src/reference/schema/type-aliases/basic.kt @@ -1,5 +1,7 @@ fun main() {} +// #region snippet class Sample typealias Other = Sample +// #endregion snippet diff --git a/book/src/schema/type-aliases/basic.py b/book/src/reference/schema/type-aliases/basic.py similarity index 77% rename from book/src/schema/type-aliases/basic.py rename to book/src/reference/schema/type-aliases/basic.py index 91f5649..29cf04e 100644 --- a/book/src/schema/type-aliases/basic.py +++ b/book/src/reference/schema/type-aliases/basic.py @@ -2,9 +2,11 @@ from typing import TypeAlias +# region snippet @dataclass class Sample: pass Other: TypeAlias = Sample +# endregion snippet diff --git a/book/src/schema/type-aliases/basic.rs b/book/src/reference/schema/type-aliases/basic.rs similarity index 100% rename from book/src/schema/type-aliases/basic.rs rename to book/src/reference/schema/type-aliases/basic.rs diff --git a/book/src/schema/type-aliases/basic.stef b/book/src/reference/schema/type-aliases/basic.stef similarity index 100% rename from book/src/schema/type-aliases/basic.stef rename to book/src/reference/schema/type-aliases/basic.stef diff --git a/book/src/schema/type-aliases/basic.ts b/book/src/reference/schema/type-aliases/basic.ts similarity index 100% rename from book/src/schema/type-aliases/basic.ts rename to book/src/reference/schema/type-aliases/basic.ts diff --git a/book/src/wire-format/index.md b/book/src/reference/wire-format.md similarity index 99% rename from book/src/wire-format/index.md rename to book/src/reference/wire-format.md index 0b9ef20..1ae504a 100644 --- a/book/src/wire-format/index.md +++ b/book/src/reference/wire-format.md @@ -1,6 +1,6 @@ # Wire format - +[[toc]] The wire format takes a lot of inspiration from both [bincode](https://github.com/bincode-org/bincode) and [postcard](https://github.com/jamesmunns/postcard). As tags are involved to identify fields, it takes some ideas from [Protobuf](https://protobuf.dev) and [Cap'n Proto](https://capnproto.org) as well. diff --git a/book/src/schema/arrays.md b/book/src/schema/arrays.md deleted file mode 100644 index 0b8c82c..0000000 --- a/book/src/schema/arrays.md +++ /dev/null @@ -1,42 +0,0 @@ -# Arrays - - - - -## Schema - -```stef -{{#include arrays/basic.stef}} -``` - -## Languages - -### Rust - -```rust -{{#include arrays/basic.rs}} -``` - -### Go - -```go -{{#include arrays/basic.go:5:}} -``` - -### Kotlin - -```kotlin -{{#include arrays/basic.kt:3:}} -``` - -### TypeScript - -```typescript -{{#include arrays/basic.ts}} -``` - -### Python - -```python -{{#include arrays/basic.py}} -``` diff --git a/book/src/schema/enums.md b/book/src/schema/enums.md deleted file mode 100644 index c38fb6f..0000000 --- a/book/src/schema/enums.md +++ /dev/null @@ -1,84 +0,0 @@ -# Enums - - - - -## Basic - -### Schema {#basic-schema} - -```stef -{{#include enums/basic.stef}} -``` - -### Languages {#basic-lang} - -#### Rust {#basic-lang-rs} - -```rust -{{#include enums/basic.rs}} -``` - -#### Go {#basic-lang-go} - -```go -{{#include enums/basic.go:5:}} -``` - -#### Kotlin {#basic-lang-kt} - -```kotlin -{{#include enums/basic.kt:3:}} -``` - -#### TypeScript {#basic-lang-ts} - -```typescript -{{#include enums/basic.ts}} -``` - -#### Python {#basic-lang-py} - -```python -{{#include enums/basic.py:3:}} -``` - -## Advanced - -### Schema {#advanced-schema} - -```stef -{{#include enums/advanced.stef}} -``` - -### Languages {#advanced-lang} - -#### Rust {#advanced-lang-rs} - -```rust -{{#include enums/advanced.rs}} -``` - -#### Go {#advanced-lang-go} - -```go -{{#include enums/advanced.go:5:}} -``` - -#### Kotlin {#advanced-lang-kt} - -```kotlin -{{#include enums/advanced.kt:3:}} -``` - -#### TypeScript {#advanced-lang-ts} - -```typescript -{{#include enums/advanced.ts}} -``` - -#### Python {#advanced-lang-py} - -```python -{{#include enums/advanced.py:3:}} -``` diff --git a/book/src/schema/imports.md b/book/src/schema/imports.md deleted file mode 100644 index 8165bfb..0000000 --- a/book/src/schema/imports.md +++ /dev/null @@ -1,9 +0,0 @@ -# Imports - - - -## Schema - -```stef -{{#include imports/basic.stef}} -``` diff --git a/book/src/schema/modules.md b/book/src/schema/modules.md deleted file mode 100644 index f30a9da..0000000 --- a/book/src/schema/modules.md +++ /dev/null @@ -1,17 +0,0 @@ -# Modules - - - -## Schema - -```stef -{{#include modules/basic.stef}} -``` - -## Nesting - -### Schema {#nesting-schema} - -```stef -{{#include modules/nesting.stef}} -``` diff --git a/book/src/schema/references.md b/book/src/schema/references.md deleted file mode 100644 index ec4a8cf..0000000 --- a/book/src/schema/references.md +++ /dev/null @@ -1,9 +0,0 @@ -# References - - - -## Schema - -```stef -{{#include references/basic.stef}} -``` diff --git a/book/src/schema/statics.md b/book/src/schema/statics.md deleted file mode 100644 index 0a8edda..0000000 --- a/book/src/schema/statics.md +++ /dev/null @@ -1,3 +0,0 @@ -# Statics - - diff --git a/book/src/schema/structs/unit.kt b/book/src/schema/structs/unit.kt deleted file mode 100644 index 22a428f..0000000 --- a/book/src/schema/structs/unit.kt +++ /dev/null @@ -1,3 +0,0 @@ -fun main() {} - -class Sample diff --git a/book/src/schema/type-aliases.md b/book/src/schema/type-aliases.md deleted file mode 100644 index a84a98f..0000000 --- a/book/src/schema/type-aliases.md +++ /dev/null @@ -1,50 +0,0 @@ -# Type aliases - - - - -| Language | Example | -| ------------- | ------------------ | -| Schema / Rust | `type A = T;` | -| Go | `type A = T` | -| Kotlin | `typealias A = T` | -| TypeScript | `type A = T;` | -| Python | `A: TypeAlias = T` | - -## Schema - -```stef -{{#include type-aliases/basic.stef}} -``` - -## Languages - -### Rust - -```rust -{{#include type-aliases/basic.rs}} -``` - -### Go - -```go -{{#include type-aliases/basic.go:5:}} -``` - -### Kotlin - -```kotlin -{{#include type-aliases/basic.kt:3:}} -``` - -### TypeScript - -```typescript -{{#include type-aliases/basic.ts}} -``` - -### Python - -```python -{{#include type-aliases/basic.py:3:}} -``` diff --git a/bun.lockb b/bun.lockb index e405c6b4f7e3ddce718585e10c08d6e6a0b47dba..e3cdc278e4bc0ff6facc899bea0b56a19b96ea9c 100755 GIT binary patch literal 46280 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

lh%^zdM1@xY!MZ!ml{8 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 literal 88384 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%0Di)`u7VPd3FF{{wsfhfRFsE!xQT?6n_)ogC)2U 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