From a3a7a0080864be2d0e278bd66528b083e7c8b768 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 1 Jan 2024 23:34:34 +0100 Subject: [PATCH 001/189] add typst design document stuff --- .gitignore | 1 + docs/design/types.typ | 10 ++++++++++ docs/template.typ | 12 ++++++++++++ justfile | 2 ++ 4 files changed, 25 insertions(+) create mode 100644 docs/design/types.typ create mode 100644 docs/template.typ create mode 100644 justfile diff --git a/.gitignore b/.gitignore index fcaa00f..1407055 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .direnv/ /target .pre-commit-config.yaml +*.pdf diff --git a/docs/design/types.typ b/docs/design/types.typ new file mode 100644 index 0000000..2e4af6e --- /dev/null +++ b/docs/design/types.typ @@ -0,0 +1,10 @@ +#import "../template.typ": conf +#show: doc => conf( + doc +) + += meow nya + +nyanyanya + +#lorem(50) diff --git a/docs/template.typ b/docs/template.typ new file mode 100644 index 0000000..6022b41 --- /dev/null +++ b/docs/template.typ @@ -0,0 +1,12 @@ +#let conf( + doc +) = { + set text(font: "Atkinson Hyperlegible"); + show heading: it => [ + #set text(font: "Montserrat", weight: "regular") + + #it + ] + + doc +} diff --git a/justfile b/justfile new file mode 100644 index 0000000..9228b4c --- /dev/null +++ b/justfile @@ -0,0 +1,2 @@ +doc-design: + typst compile docs/design/*.typ --root=docs From 22a655fd2477bf75e076b7159d1b64930cac7122 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 10 Jan 2024 12:45:41 +0100 Subject: [PATCH 002/189] write initial type signature notation proposal --- docs/design/type-notation.typ | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 docs/design/type-notation.typ diff --git a/docs/design/type-notation.typ b/docs/design/type-notation.typ new file mode 100644 index 0000000..58977b9 --- /dev/null +++ b/docs/design/type-notation.typ @@ -0,0 +1,23 @@ +#import "../template.typ": conf +#show: doc => conf( + doc +) + += Type/signature notation + +Operator signature that takes two unnamed arbitrary numbers of the same type and returns another: +`Op [ T T ] -> T` + +Operator that takes a 32 bit signed integer and returns another: +`Op i32 -> i32` + +Operator that does the same with a generic arbitrary number type: +`Op T -> T` + +One dimensional list of 32 bit signed integers: +`[i32]` + +Due to inference, you'll also be able to use that in some mathematical operations with integers: + +`[i32] + i32` is a valid operation, for example (of course, you can't add types.) But that wouldn't add the second one to the list, but rather add the single i32 to all values in the left hand side list). That would also work with more dimensional arrays and dynamic streams like videos. + From e1dc5ce13284507821d89272d3eb19fe19faba11 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 11 Jan 2024 10:48:43 +0100 Subject: [PATCH 003/189] doc: change code from inline to blocks --- docs/design/type-notation.typ | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/design/type-notation.typ b/docs/design/type-notation.typ index 58977b9..18e7d95 100644 --- a/docs/design/type-notation.typ +++ b/docs/design/type-notation.typ @@ -1,21 +1,31 @@ #import "../template.typ": conf -#show: doc => conf( - doc -) +#show: conf = Type/signature notation Operator signature that takes two unnamed arbitrary numbers of the same type and returns another: -`Op [ T T ] -> T` + +```iowo +Op [ T T ] -> T +``` Operator that takes a 32 bit signed integer and returns another: -`Op i32 -> i32` + +```iowo +Op i32 -> i32 +``` Operator that does the same with a generic arbitrary number type: -`Op T -> T` + +```iowo +Op T -> T +``` One dimensional list of 32 bit signed integers: -`[i32]` + +```iowo +[i32] +``` Due to inference, you'll also be able to use that in some mathematical operations with integers: From b91e697449c77c54bac2ab123cf38863b8eedce1 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 11 Jan 2024 10:55:25 +0100 Subject: [PATCH 004/189] add example for multiple generics --- docs/design/type-notation.typ | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/design/type-notation.typ b/docs/design/type-notation.typ index 18e7d95..7858b50 100644 --- a/docs/design/type-notation.typ +++ b/docs/design/type-notation.typ @@ -9,6 +9,11 @@ Operator signature that takes two unnamed arbitrary numbers of the same type and Op [ T T ] -> T ``` +Operator signature that takes any color and any number type, and returns a color again: +```iowo +Op [ C M ] -> C +``` + Operator that takes a 32 bit signed integer and returns another: ```iowo From efdfb5705ea10e269c9e4efdd44ea8ccf5dc3afc Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 1 Jan 2024 23:56:31 +0100 Subject: [PATCH 005/189] actually write things --- docs/design/types.typ | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/design/types.typ b/docs/design/types.typ index 2e4af6e..1fa9fac 100644 --- a/docs/design/types.typ +++ b/docs/design/types.typ @@ -3,8 +3,14 @@ doc ) -= meow nya += Type data model -nyanyanya +== Requirements -#lorem(50) +- Color-aware + - It can handle colors and colorspaces for images + - ocio???? +- number/number type support +- custom types (structs/enums) +- algebraic enums +- traits (`Numeric`...) From 388827a50eadbf800ed4532a1290d55d2d3d5e3e Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 2 Jan 2024 01:45:21 +0100 Subject: [PATCH 006/189] docs: add readme --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..72f8952 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# iOwO + +Tired of remembering if the argument order matters on this ImageMagick command? +Tired of having shell parsing interfere with what you actually want to do? + +Fear no more, with iOwO (pronounced iowo ( +we believe at least (we don't know what we're doing [please help]!) +)) you can just write a plain pipeline with [nushell]-ish syntax! +Or that's what we want it to be at least. + +So, uh, grab a seat and a beverage, sit down, and maybe take a look around. +Although there's not much here — _yet_. + +[please help]: ./CONTRIBUTING.md +[nushell]: https://www.nushell.sh/ + From 6217a984a24b02adedb2dd0316ff7da2b7e4cfc9 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 2 Jan 2024 02:45:20 +0100 Subject: [PATCH 007/189] repo: make typst compilation more generic --- docs/compiled/.gitkeep | 1 + justfile | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 docs/compiled/.gitkeep diff --git a/docs/compiled/.gitkeep b/docs/compiled/.gitkeep new file mode 100644 index 0000000..a682a23 --- /dev/null +++ b/docs/compiled/.gitkeep @@ -0,0 +1 @@ +the just script will place compiled pdfs in here. thank you for your understanding. diff --git a/justfile b/justfile index 9228b4c..a240f64 100644 --- a/justfile +++ b/justfile @@ -1,2 +1,5 @@ -doc-design: - typst compile docs/design/*.typ --root=docs +docs: + for doc in $(fd '.typ' './docs' --exclude 'template*' --exclude 'util*'); do \ + typst compile $doc --root=docs; \ + mv "$(dirname $doc)/$(basename $doc .typ).pdf" docs/compiled/; \ + done From 374672624537d2f18b5f8da95f7d1323a2d1b220 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 2 Jan 2024 05:03:29 +0100 Subject: [PATCH 008/189] docs: rework template and add stages framework --- docs/design/graphics.typ | 79 +++++++++++++++++++++++++++++++++++++ docs/design/iowo-design.typ | 31 +++++++++++++++ docs/design/types.typ | 16 -------- docs/template.typ | 47 +++++++++++++++++++--- justfile | 1 + 5 files changed, 152 insertions(+), 22 deletions(-) create mode 100644 docs/design/graphics.typ create mode 100644 docs/design/iowo-design.typ delete mode 100644 docs/design/types.typ diff --git a/docs/design/graphics.typ b/docs/design/graphics.typ new file mode 100644 index 0000000..cf5f7e0 --- /dev/null +++ b/docs/design/graphics.typ @@ -0,0 +1,79 @@ +#import "@preview/cetz:0.1.2" +#import cetz.draw: * + +// quick reference +// - `graphic` is for inline icons/images +// - `canvas` is for centered more prominent stuff +// - `group` can be used in either of ^, but not standalone + +#let graphic(what) = box({ + cetz.canvas({ + // any preamble-ish stuff can go here + set-style( + mark: (angle: 90deg) + ) + + what + }) +}) + +#let canvas(what) = { + align(center, graphic(what)) +} + + +// smaller stuff + +#let arrow(length: 1cm, lift: 4pt, stroke: 1pt) = graphic({ + line((0, lift), (rel: (length, 0)), mark: (end: ">", stroke: stroke)) + + // hack for the bounding box bottom + // so that `lift` even has any effect + line((0, 0), (0, 0), stroke: none) +}) + +// larger stuff + +#let nodes( + distance: 3cm, + arrow-spacing: 0.15cm, + // cetz will support rounded rects in 0.2.0 + style: (frame: "rect", padding: 0.1cm), + ..labels, +) = group({ + let labels = labels.pos() + + // draw each label itself + for (i, label) in labels.enumerate() { + if i != 0 { + set-origin((distance, 0)) + } + content((0, 0), name: "label-" + str(i), label, ..style) + } + + // then draw an arrow from each to each + // since an arrow is between two, the last one can't be connected with the "next-to-last" one + // so we leave it out + for i in range(labels.len() - 1) { + line( + (rel: (arrow-spacing, 0), to: "label-" + str(i) + ".right"), + (rel: (-arrow-spacing, 0), to: "label-" + str(i + 1) + ".left"), + mark: (end: ">"), + ) + } +}) + +#let stages-overview = canvas({ + nodes( + [Source], + [Graph IR], + [Optimizer], + [Compiler], + [VM Bytecode], + [VM], + ) +}) + +// literally just for standalone display of the graphics alone +#import "../template.typ": conf +#show: conf diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ new file mode 100644 index 0000000..5c02cee --- /dev/null +++ b/docs/design/iowo-design.typ @@ -0,0 +1,31 @@ +#import "../template.typ": conf +#import "graphics.typ" + +#show: conf.with(title: [iOwO design], subtitle: [don't worry, we're just dreaming]) +#show ">": graphics.arrow() + += Type data model + +== Requirements + +- Color-aware + - It can handle colors and colorspaces for images + - ocio???? +- number/number type support +- custom types (structs/enums) +- algebraic enums +- traits (`Numeric`...) + += Execution stages + +#graphics.stages-overview + +== Source > Graph IR + +== Graph IR > VM Bytecode + +=== Optimizer + +=== Compiler + +== VM Bytecode > VM diff --git a/docs/design/types.typ b/docs/design/types.typ deleted file mode 100644 index 1fa9fac..0000000 --- a/docs/design/types.typ +++ /dev/null @@ -1,16 +0,0 @@ -#import "../template.typ": conf -#show: doc => conf( - doc -) - -= Type data model - -== Requirements - -- Color-aware - - It can handle colors and colorspaces for images - - ocio???? -- number/number type support -- custom types (structs/enums) -- algebraic enums -- traits (`Numeric`...) diff --git a/docs/template.typ b/docs/template.typ index 6022b41..a688b07 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -1,12 +1,47 @@ +// would also be interesting to try out IBM Plex Mono/Sans sometime +#let atk = "Atkinson Hyperlegible" +#let fonts = ( + main: (font: atk, size: 12pt), + + title: (font: atk, size: 20pt), + subtitle: (font: atk, size: 10pt), + heading: (font: "Montserrat", weight: "regular"), +) + #let conf( - doc + title: none, + subtitle: none, + doc, ) = { - set text(font: "Atkinson Hyperlegible"); - show heading: it => [ - #set text(font: "Montserrat", weight: "regular") + set page( + numbering: "1 / 1", + header: locate(loc => { + datetime.today().display() - #it - ] + if counter(page).at(loc).first() > 1 { + // on all pages other than the first, the title is useful to have at hand + h(1fr) + title + } + }), + ) + set text(..fonts.main) + set heading(numbering: "A.1") + show heading: it => text(..fonts.heading, it) + + // document title + if title != none { + align( + right, + text(..fonts.title, title) + + v(-12pt) + + text(..fonts.subtitle, subtitle) + ) + + v(0.25cm) + } + + // content itself doc } diff --git a/justfile b/justfile index a240f64..e0979b3 100644 --- a/justfile +++ b/justfile @@ -3,3 +3,4 @@ docs: typst compile $doc --root=docs; \ mv "$(dirname $doc)/$(basename $doc .typ).pdf" docs/compiled/; \ done + From 32b547f9fae4588cf459136f1d51daeb15f80822 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 7 Jan 2024 21:43:26 +0100 Subject: [PATCH 009/189] meta: set up some signs --- CODE_OF_CONDUCT.md | 11 ++++++ CONTRIBUTING.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..50eeec5 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,11 @@ +See https://www.rust-lang.org/policies/code-of-conduct. +The current maintainers, that is, + +- [@Schrottkatze](https://forge.katzen.cafe/schrottkatze) +- [@multisamplednight](https://forge.katzen.cafe/multisamplednight) +- @iota-xSK + +are the entities to email, message or talk to if you feel like any interaction in the context of +iOwO is not okay. We'll try to answer as soon as we can. + +Please do **not** open an issue. Notify the maintainers privately instead. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..461b274 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,85 @@ +# Contributing to iOwO + +Before we get started, thank you for thinking about doing so! + +## Through an issue + +- Be excellent to each other. Adhere to the [code of conduct]. +- About the title: If you had 5 seconds to tell someone the essence of the issue, what would it be? + +### Bugs + +- Write out in detail which steps in which order are necessary to reproduce the bug. +- Include environmental information as well, in specific + - How did you install iOwO? + - What version of iOwO are you running? + - What operating system are you running? + In the case of a Linux distro, mention the specific distro and when you last update as well. +- If the bug causes a crash, try to get a backtrace or in worse cases, a coredump. + +### Feature requests + +- Be sure to include a motivation in which case your intended feature would be used, + even if it seems obvious to you. +- Estimate what would be needed to implement the feature. + - Is it an addition to the language itself? + - Is it just a new command? + - Does it ground-breakingly change how iOwO works? + +## Through a PR + +1. Clone the repo. +2. Switch to a new appropiately named branch for what you want to do, using `git switch -c`. +3. Implement your code changes with your favorite code editor. +4. Try them with `cargo run`. +5. If there are errors or warnings, go to step 3. Commit occasionally. +6. Otherwise, + - if you have an account at https://forge.katzen.cafe, + 1. fork the repo + 2. set it up as a remote using `git remote add` + 3. push using `git push @ -u` + - if you don't, + 1. combine your patches using `git diff --patch` and throw them in a file + 2. send that file to one of the maintainers per email + - alongside with a description of what it does + +### Tech stack + +The techstack we operate on is + +- [typst] for documents and concrete proposals +- [Rust] for the actual code +- [Inkscape], [GIMP] and [Blender] for promotional material like logos and posters + +So if you want to contribute functionality, take a look at [The Rust Programming Language book]! +If you want to contribute thoughts and techincal designs, then consider taking a ride through +[typst's excellent tutorial]! +If you want to contribute art or the like, do that in whatever **you** are most comfortable with! + +[typst]: https://typst.app +[Rust]: https://www.rust-lang.org +[Inkscape]: https://inkscape.org/ +[GIMP]: https://www.gimp.org/ +[Blender]: https://www.blender.org/ +[The Rust Programming Language book]: https://doc.rust-lang.org/book/ +[typst's excellent tutorial]: https://typst.app/docs/tutorial + +## Politics + +- Current maintainers are defined as the entities listed in the [code of conduct]. + +### PRs + +- Every PR requires an approving review from a maintainer (that is not the author) before merge. +- Maintainers can merge their own PRs. + - But only after approval. + +### Major decisions + +- All current maintainers have to agree **unanimously**. +- Agreement must be based on [informed consent]. + - In effect, a maintainer has to understand what they agree to. + +[code of conduct]: ./CODE_OF_CONDUCT.md +[informed consent]: https://en.wikipedia.org/wiki/Informed_consent + From b30cbb4d7bd46338d2223d7fa6cf3ef3bfc5e86c Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 9 Jan 2024 10:21:57 +0100 Subject: [PATCH 010/189] docs(design): actually write some content --- docs/design/graphics.typ | 5 +- docs/design/iowo-design.typ | 198 ++++++++++++++++++++++++++++++++++-- docs/template.typ | 12 +++ 3 files changed, 204 insertions(+), 11 deletions(-) diff --git a/docs/design/graphics.typ b/docs/design/graphics.typ index cf5f7e0..5e0ef4c 100644 --- a/docs/design/graphics.typ +++ b/docs/design/graphics.typ @@ -67,10 +67,7 @@ nodes( [Source], [Graph IR], - [Optimizer], - [Compiler], - [VM Bytecode], - [VM], + [Runtime], ) }) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index 5c02cee..4d8e8d8 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -2,15 +2,81 @@ #import "graphics.typ" #show: conf.with(title: [iOwO design], subtitle: [don't worry, we're just dreaming]) -#show ">": graphics.arrow() + +// highlight important terms in bold +#let expand(it) = { + ("(" + + upper(it.first()) + + "|" + + it.first() + + ")" + + it.clusters().slice(1).join() + + "s?") +} +#let singlify(it) = { + it = lower(it) + if it.ends-with("s") { + it = it.slice(0, -1) + } + it +} +#let terminate-recursion(it) = { + let clusters = it.text.clusters() + clusters.insert(1, "\u{FEFF}") + clusters.join() +} +// TODO: could make this just look over headings in section "Execution stages" tbh +#let terms = ( + "source", + "graph IR", + "runtime", + + "optimizer", + "scheduler", + "VM", + + "command", + "pipeline", + "input", "argument", "consumer", + "output", "streamer", + "modifier", +) +#let terms-trigger = regex(terms.map(expand).join("|")) +#show raw: it => { + // avoid making terms in codeblocks bold + show terms-trigger: terminate-recursion + it +} +#show terms-trigger: strong + +// color codeblocks +// haskell hl seems to work ok for this +#show raw.where(lang: "iowo", block: true): it => { + raw(it.text, lang: "haskell", block: true) +} + +// actual content lol + +#outline( + indent: auto, + fill: line( + length: 100%, + stroke: ( + cap: "round", + join: "round", + thickness: 0.5pt, + paint: luma(75%), + ), + ), +) = Type data model == Requirements - Color-aware - - It can handle colors and colorspaces for images - - ocio???? + - It can handle colors and colorspaces for images + - OpenColorIO? - number/number type support - custom types (structs/enums) - algebraic enums @@ -20,12 +86,130 @@ #graphics.stages-overview -== Source > Graph IR +== Source -== Graph IR > VM Bytecode +Functional and pipeline-based. +However, in contrast to classic shell commands, +commands can have multiple outputs and multiple inputs. + +=== Commands + +The foundation of actually "doing" something. + +- Can have any, even infinite, amount of inputs and outputs. + - Their amounts may or may not be equal. +- Inputs and outputs must have their types explicitly declared. +- An command with + - at least one output is called a streamer. + - at least one input is called a consumer. + - _both_ at least one input and at least one output is _both_ a streamer and a consumer, and culminatively called a modifier. +- May also contain spaces in its name. + +==== Inputs + +- Based on position. +- Inputs can be provided both through the pipeline and ad-hoc. +- Ad-hoc inputs are called arguments. +- So all of these are equivalent: + +```iowo +1 | add 2 +add 1 2 +[ 1 2 ] | add +``` + +==== Outputs + +- Also based on position. + +=== Pipelines + +- Exchange data between streamers and consumers. + +==== Simple forwarding + +In the simplest case, where inputs map to outputs bijectively#footnote[one to one], pipelines are just pipes and forward unchanged: + +```iowo +open owo.png | invert | save owo.png +``` + +==== Splitting + +To handle each output of a streamer individually, they can be _split_: + +```iowo +mask +|> invert -- would invert the unmasked part +|> show -- would show the masked part +``` + +==== Combination + +To throw multiple streamers into the inputs of a consumer, they can be _combined_: + +```iowo +open base.png >| +open stencil.png >| +mask +``` + +However, since lists are automatically spliced into inputs, this is equivalent to the above: + +```iowo +[ + open base.png, + open stencil.png, +] +| mask +``` + +=== Comments + +Done with any of `--` or `//`. + +=== Data types + +==== Lists + +- Signified by `[]` braces. +- If thrown into a pipeline, it automatically works like a streamer. +- Can be delimited by commas. + - Must be delimited by commas if a contained streamer takes an input. +- May have a trailing comma. +- Outputs of streamers are spliced into the contained list. + - In effect, they are automatically flattened. + +== Graph IR === Optimizer -=== Compiler +Merges and simplifies commands in the graph IR. -== VM Bytecode > VM +== Runtime + +=== Scheduler + +Looks at the graph IR and decides when the VM should execute what. + +=== VM + += Open questions + +- @input + - At which position are arguments injected into command inputs? + - How could that be controlled if set to e.g. the end by default? + - Not all inputs are order-independent, e.g. `div` + - Should inputs and outputs really be positional? + - Could make more complex commands hard to read + - But keyworded could also make code very noisy + - Maybe a middle ground, such that at most 1 input is allowed to be positional? +- @pipeline + - We need some way to reshuffle and reorder outputs and inputs in a pipeline +- @splitting + - How would one split different outputs into a list? +- Should outputs that are not thrown into a consumer be automatically displayed in some kind of debug view? + - Or should that be done instead using a debug `show` command or the like? +- Should consumers be called sinks instead? + - Shorter + - More ambiguous if only looking at the first char though diff --git a/docs/template.typ b/docs/template.typ index a688b07..5bdf52a 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -15,6 +15,7 @@ ) = { set page( numbering: "1 / 1", + margin: 3.25cm, header: locate(loc => { datetime.today().display() @@ -29,6 +30,17 @@ set heading(numbering: "A.1") show heading: it => text(..fonts.heading, it) + show raw.where(block: true): box.with( + fill: luma(95%), + inset: 1.25em, + radius: 0.75em, + width: 45em, + ) + show raw.where(block: false): box.with( + fill: luma(95%), + outset: 0.25em, + radius: 0.25em, + ) // document title if title != none { From 9233b0e339203446778ea99266d4d9b5bd7af4cb Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 9 Jan 2024 10:27:07 +0100 Subject: [PATCH 011/189] docs(contributing): add penpot --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 461b274..2931403 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,7 @@ The techstack we operate on is - [typst] for documents and concrete proposals - [Rust] for the actual code - [Inkscape], [GIMP] and [Blender] for promotional material like logos and posters +- [Penpot] for layouting prototypes and the like So if you want to contribute functionality, take a look at [The Rust Programming Language book]! If you want to contribute thoughts and techincal designs, then consider taking a ride through @@ -61,6 +62,7 @@ If you want to contribute art or the like, do that in whatever **you** are most [Inkscape]: https://inkscape.org/ [GIMP]: https://www.gimp.org/ [Blender]: https://www.blender.org/ +[Penpot]: https://penpot.app/ [The Rust Programming Language book]: https://doc.rust-lang.org/book/ [typst's excellent tutorial]: https://typst.app/docs/tutorial From 6bd07b639bfa4a8e49562b08a4b288d0a5848d9d Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 9 Jan 2024 11:58:42 +0100 Subject: [PATCH 012/189] docs(design): add larger source example --- docs/design/graphics.typ | 1 + docs/design/iowo-design.typ | 21 +++++++++++++++++++-- docs/template.typ | 3 ++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/design/graphics.typ b/docs/design/graphics.typ index 5e0ef4c..320a46d 100644 --- a/docs/design/graphics.typ +++ b/docs/design/graphics.typ @@ -66,6 +66,7 @@ #let stages-overview = canvas({ nodes( [Source], + [AST], [Graph IR], [Runtime], ) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index 4d8e8d8..76b4697 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -25,9 +25,14 @@ clusters.insert(1, "\u{FEFF}") clusters.join() } -// TODO: could make this just look over headings in section "Execution stages" tbh +// even though it looks like this could be automated with a `query`, +// this'd require wrapping the whole document in a show rule +// at which point `query` doesn't find anything anymore #let terms = ( "source", + "ast", + "abstract syntax tree", + "Abstract Syntax Tree", "graph IR", "runtime", @@ -86,7 +91,15 @@ #graphics.stages-overview -== Source +== Source + +```iowo +open base.png >| +open stencil.png >| +mask +|> (invert | show) +|> show +``` Functional and pipeline-based. However, in contrast to classic shell commands, @@ -180,6 +193,10 @@ Done with any of `--` or `//`. - Outputs of streamers are spliced into the contained list. - In effect, they are automatically flattened. +== Abstract Syntax Tree + +Essentially just the source lexed and parsed. + == Graph IR === Optimizer diff --git a/docs/template.typ b/docs/template.typ index 5bdf52a..fc7f8b2 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -38,7 +38,8 @@ ) show raw.where(block: false): box.with( fill: luma(95%), - outset: 0.25em, + outset: (y: 0.25em), + inset: (x: 0.15em), radius: 0.25em, ) From b9ea83b1c6ff0c972c558a56c856e2a99707b573 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Tue, 9 Jan 2024 12:42:51 +0100 Subject: [PATCH 013/189] docs(design): get rid of ast --- docs/design/iowo-design.typ | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index 76b4697..ce8f5c5 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -31,8 +31,6 @@ #let terms = ( "source", "ast", - "abstract syntax tree", - "Abstract Syntax Tree", "graph IR", "runtime", @@ -193,12 +191,12 @@ Done with any of `--` or `//`. - Outputs of streamers are spliced into the contained list. - In effect, they are automatically flattened. -== Abstract Syntax Tree - -Essentially just the source lexed and parsed. - == Graph IR +The parsed representation of the source, and also what the runtime operates on. + +In a way, this is the AST, except that it's not a tree. + === Optimizer Merges and simplifies commands in the graph IR. From bebf2a97a44c7421ad0d8a68efc9d271fe525402 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:10:05 +0100 Subject: [PATCH 014/189] docs(design): add graph ir repr and explain a bit --- .gitignore | 1 + docs/design/graphics.typ | 184 +++++++++++++++++++++++++++++++++++- docs/design/iowo-design.typ | 24 ++++- docs/template.typ | 1 + 4 files changed, 202 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 1407055..b2f817b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /target .pre-commit-config.yaml *.pdf +*.png diff --git a/docs/design/graphics.typ b/docs/design/graphics.typ index 320a46d..f14e65e 100644 --- a/docs/design/graphics.typ +++ b/docs/design/graphics.typ @@ -10,7 +10,8 @@ cetz.canvas({ // any preamble-ish stuff can go here set-style( - mark: (angle: 90deg) + mark: (angle: 90deg), + stroke: (cap: "round", join: "round"), ) what @@ -24,7 +25,7 @@ // smaller stuff -#let arrow(length: 1cm, lift: 4pt, stroke: 1pt) = graphic({ +#let arrow(length: 0.4cm, lift: 3pt, stroke: 1pt) = graphic({ line((0, lift), (rel: (length, 0)), mark: (end: ">", stroke: stroke)) // hack for the bounding box bottom @@ -34,7 +35,7 @@ // larger stuff -#let nodes( +#let sequence( distance: 3cm, arrow-spacing: 0.15cm, // cetz will support rounded rects in 0.2.0 @@ -64,14 +65,187 @@ }) #let stages-overview = canvas({ - nodes( + sequence( [Source], - [AST], [Graph IR], [Runtime], ) }) +// A few commands to help demonstration in the docs. +// Supply a string to mark the input or output as simple. +// (fwiw in typst, parenthesis around a single expression just evaluate the expression, and don't put it into an array) +#let cmds = ( + "const": ( + inputs: (), + outputs: ("data",), + ), + "open": ( + inputs: ("path",), + outputs: ("data",), + ), + "save": ( + inputs: ("data", "path"), + outputs: (), + ), + "show": ( + inputs: ("data",), + outputs: (), + ), + "invert": ( + inputs: ("base",), + outputs: ("",), + ), + "mask": ( + inputs: ("base", "stencil"), + outputs: ("masked", "rest"), + ), +) + +#let opposite(anchor) = { + ( + "bottom": "top", + "top": "bottom", + ) + .at(anchor) +} + +#let sockets( + start, + stop, + sockets, + socket-size: (0.5, 0.1), + socket-shape: "circle", + parent-name: "", + label-anchor: "bottom", +) = { + for (i, socket) in sockets.enumerate() { + let x-ratio = (i + 1) / (sockets.len() + 1) + let center = (start, x-ratio, stop) + + let socket-name = parent-name + "/" + socket + + let common-args = (name: socket-name, fill: black) + if socket-shape == "rect" { + rect( + (rel: ((0, 0), -0.5, socket-size), to: center), + (rel: socket-size), + ..common-args, + ) + } else if socket-shape == "circle" { + circle( + center, + radius: socket-size.at(1), + ..common-args, + ) + } else { + panic("unknown socket shape: `" + socket-shape + "`") + } + set-style(fill: none) + + // don't ask why, I don't know myself + let use-opposite-anchor = socket-shape == "circle" + content( + socket-name + "." + if use-opposite-anchor { opposite(label-anchor) } else { label-anchor }, + anchor: opposite(label-anchor), + box(inset: 0.25em, text(8pt, socket)), + ) + } +} + +#let node( + at, + size: (3, 1.5), + ty: none, + body: none, + name: "unnamed", +) = { + set-origin(at) + let label = [#ty] + if body != none { + label += [\ ] + text(0.7em, font: "IBM Plex Mono", body) + size.at(1) += 0.5 + } + rect((0, 0), (rel: size), name: name) + content(((0, 0), 0.5, size), align(center, label)) + + // input and output sockets + if ty == none { return } + let ty = cmds.at(ty) + + let sockets = sockets.with(parent-name: name) + sockets( + ((0, 0), "|-", size), + size, + ty.inputs, + ) + sockets( + (0, 0), + ((0, 0), "-|", size), + label-anchor: "top", + ty.outputs, + ) + + // helper text + let helper(base, label, where) = { + if not type(base) != list or base.len() != 0 { + content( + name + "." + where + "-left", + anchor: "right", + box(inset: 0.25em, text(fill: luma(75%), label)) + ) + } + } + + helper(ty.inputs, [in], "top") + helper(ty.outputs, [out], "bottom") + + // reset the origin transform so other nodes can still work in the global coord system + // can't use groups since otherwise the anchors are not exported + set-origin(((0, 0), -1, at)) +} + +#let connect(from, to, bend: 1.5, mark-cfg: (size: 0.25, offset: 0.1)) = { + bezier( + from, + to, + (rel: (0, -bend * 1cm), to: from), + (rel: (0, bend * 1cm), to: to), + ) + mark( + (rel: (0, mark-cfg.size + mark-cfg.offset), to: to), + (rel: (0, -mark-cfg.size)), + symbol: ">", + ) +} + +#let graph-example = canvas({ + let x = 3 + let y = -3 + node((-x, -0.75 * y), ty: "const", body: "\"base.png\"", name: "base") + node((x, -0.75 * y), ty: "const", body: "\"stencil.png\"", name: "stencil") + node((-x, 0), ty: "open", name: "a") + node((x, 0), ty: "open", name: "b") + node((0, y), ty: "mask", name: "c") + node((-x, 2 * y), ty: "invert", name: "d") + node((-x, 2.75 * y), ty: "show", name: "e") + node((x, 2.75 * y), ty: "show", name: "f") + + connect("base/data", "a/path") + connect("stencil/data", "b/path") + + connect("a/data", "c/base") + connect("b/data", "c/stencil") + + connect("c/masked", "d/base") + connect("d/", "e/data") + + connect("c/rest", "f/data", bend: 2.5) +}) + // literally just for standalone display of the graphics alone #import "../template.typ": conf #show: conf +#set page(width: auto, height: auto) + +#graph-example diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index ce8f5c5..e5f07f7 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -1,5 +1,6 @@ #import "../template.typ": conf #import "graphics.typ" +#import graphics: arrow #show: conf.with(title: [iOwO design], subtitle: [don't worry, we're just dreaming]) @@ -30,7 +31,7 @@ // at which point `query` doesn't find anything anymore #let terms = ( "source", - "ast", + "AST", "graph IR", "runtime", @@ -85,18 +86,29 @@ - algebraic enums - traits (`Numeric`...) +#pagebreak() + = Execution stages #graphics.stages-overview +iOwO operates in stages. This has a number of benefits and implications: + +- One can just work on one aspect of the stages without having to know about the rest. +- Bugs are easier to trace down to one stage. +- Stages are also replacable, pluggable and usable somewhere else. + - For example, one could write a Just-In-Time compiler to replace the runtime stage, while preserving the source #arrow() graph IR step. + +However, this also makes the architecture somewhat more complicated. So here we try our best to describe how each stage looks like. If you have any feedback, feel free to drop it on #link("https://forge.katzen.cafe/katzen-cafe/iowo/issues")[the issues in the repository]! + == Source ```iowo open base.png >| open stencil.png >| mask +|> show12 |> (invert | show) -|> show ``` Functional and pipeline-based. @@ -151,8 +163,8 @@ To handle each output of a streamer individually, they can be _split_: ```iowo mask -|> invert -- would invert the unmasked part |> show -- would show the masked part +|> invert -- would invert the unmasked part ``` ==== Combination @@ -193,16 +205,22 @@ Done with any of `--` or `//`. == Graph IR +#graphics.graph-example + The parsed representation of the source, and also what the runtime operates on. In a way, this is the AST, except that it's not a tree. +It is represented in iOwO using adjacencies, where essentially the vertices#footnote[Nodes or commands in this case.] and their edges#footnote[Connections or pipes in this case.] are stored separately. + === Optimizer Merges and simplifies commands in the graph IR. == Runtime +Runs through all commands in the graph IR. It does not have any significantly other representation, and despite its name there's _no_ bytecode involved. + === Scheduler Looks at the graph IR and decides when the VM should execute what. diff --git a/docs/template.typ b/docs/template.typ index fc7f8b2..899ab30 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -29,6 +29,7 @@ set text(..fonts.main) set heading(numbering: "A.1") + show link: text.with(fill: blue) show heading: it => text(..fonts.heading, it) show raw.where(block: true): box.with( fill: luma(95%), From 221ca09961a8244745bc3eee1b48e338fa489867 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:22:29 +0100 Subject: [PATCH 015/189] docs: move config from design to template --- docs/design/iowo-design.typ | 75 ++----------------------------------- docs/template.typ | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 71 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index e5f07f7..9646ab8 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -2,76 +2,9 @@ #import "graphics.typ" #import graphics: arrow -#show: conf.with(title: [iOwO design], subtitle: [don't worry, we're just dreaming]) - -// highlight important terms in bold -#let expand(it) = { - ("(" - + upper(it.first()) - + "|" - + it.first() - + ")" - + it.clusters().slice(1).join() - + "s?") -} -#let singlify(it) = { - it = lower(it) - if it.ends-with("s") { - it = it.slice(0, -1) - } - it -} -#let terminate-recursion(it) = { - let clusters = it.text.clusters() - clusters.insert(1, "\u{FEFF}") - clusters.join() -} -// even though it looks like this could be automated with a `query`, -// this'd require wrapping the whole document in a show rule -// at which point `query` doesn't find anything anymore -#let terms = ( - "source", - "AST", - "graph IR", - "runtime", - - "optimizer", - "scheduler", - "VM", - - "command", - "pipeline", - "input", "argument", "consumer", - "output", "streamer", - "modifier", -) -#let terms-trigger = regex(terms.map(expand).join("|")) -#show raw: it => { - // avoid making terms in codeblocks bold - show terms-trigger: terminate-recursion - it -} -#show terms-trigger: strong - -// color codeblocks -// haskell hl seems to work ok for this -#show raw.where(lang: "iowo", block: true): it => { - raw(it.text, lang: "haskell", block: true) -} - -// actual content lol - -#outline( - indent: auto, - fill: line( - length: 100%, - stroke: ( - cap: "round", - join: "round", - thickness: 0.5pt, - paint: luma(75%), - ), - ), +#show: conf.with( + title: [iOwO design], + subtitle: [don't worry, we're just dreaming], ) = Type data model @@ -107,7 +40,7 @@ However, this also makes the architecture somewhat more complicated. So here we open base.png >| open stencil.png >| mask -|> show12 +|> show |> (invert | show) ``` diff --git a/docs/template.typ b/docs/template.typ index 899ab30..23216db 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -8,6 +8,49 @@ heading: (font: "Montserrat", weight: "regular"), ) +#let expand(it) = { + ("(" + + upper(it.first()) + + "|" + + it.first() + + ")" + + it.clusters().slice(1).join() + + "s?") +} +#let singlify(it) = { + it = lower(it) + if it.ends-with("s") { + it = it.slice(0, -1) + } + it +} +#let terminate-recursion(it) = { + let clusters = it.text.clusters() + clusters.insert(1, "\u{FEFF}") + clusters.join() +} +// even though it looks like this could be automated with a `query`, +// this'd require wrapping the whole document in a show rule +// at which point `query` doesn't find anything anymore +#let terms = ( + "source", + "AST", + "graph IR", + "runtime", + + "optimizer", + "scheduler", + "VM", + + "command", + "pipeline", + "input", "argument", "consumer", + "output", "streamer", + "modifier", +) +// yes, the shadowing is intentional +#let terms = regex(terms.map(expand).join("|")) + #let conf( title: none, subtitle: none, @@ -44,6 +87,20 @@ radius: 0.25em, ) + // highlight important terms in bold + show raw: it => { + // avoid making terms in codeblocks bold + show terms: terminate-recursion + it + } + show terms: strong + + // color codeblocks + // haskell hl seems to work ok for this + show raw.where(lang: "iowo", block: true): it => { + raw(it.text, lang: "haskell", block: true) + } + // document title if title != none { align( @@ -56,6 +113,20 @@ v(0.25cm) } + // outline and other prelude info + outline( + indent: auto, + fill: line( + length: 100%, + stroke: ( + cap: "round", + join: "round", + thickness: 0.5pt, + paint: luma(75%), + ), + ), + ) + // content itself doc } From cbbe2c325384ddd517b848398fdbde86231366f7 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:28:01 +0100 Subject: [PATCH 016/189] docs: only highlight standalone terms --- docs/template.typ | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/template.typ b/docs/template.typ index 23216db..712c6e7 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -48,8 +48,8 @@ "output", "streamer", "modifier", ) -// yes, the shadowing is intentional -#let terms = regex(terms.map(expand).join("|")) +// yes, the shadowing is intentional to avoid accidentally using the list +#let terms = regex("\\b(" + terms.map(expand).join("|") + ")\\b") #let conf( title: none, From 35695537bdd8ac5f73c41caff943b18f84c3ec69 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:34:52 +0100 Subject: [PATCH 017/189] docs(design): rename command -> instruction --- docs/design/iowo-design.typ | 18 +++++++++--------- docs/template.typ | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index 9646ab8..fc0069d 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -46,16 +46,16 @@ mask Functional and pipeline-based. However, in contrast to classic shell commands, -commands can have multiple outputs and multiple inputs. +instructions can have multiple outputs and multiple inputs. -=== Commands +=== Instructions The foundation of actually "doing" something. - Can have any, even infinite, amount of inputs and outputs. - Their amounts may or may not be equal. - Inputs and outputs must have their types explicitly declared. -- An command with +- An instruction with - at least one output is called a streamer. - at least one input is called a consumer. - _both_ at least one input and at least one output is _both_ a streamer and a consumer, and culminatively called a modifier. @@ -144,15 +144,15 @@ The parsed representation of the source, and also what the runtime operates on. In a way, this is the AST, except that it's not a tree. -It is represented in iOwO using adjacencies, where essentially the vertices#footnote[Nodes or commands in this case.] and their edges#footnote[Connections or pipes in this case.] are stored separately. +It is represented in iOwO using adjacencies, where essentially the vertices#footnote[Nodes or instructions in this case.] and their edges#footnote[Connections or pipes in this case.] are stored separately. === Optimizer -Merges and simplifies commands in the graph IR. +Merges and simplifies instructions in the graph IR. == Runtime -Runs through all commands in the graph IR. It does not have any significantly other representation, and despite its name there's _no_ bytecode involved. +Runs through all instructions in the graph IR. It does not have any significantly other representation, and despite its name there's _no_ bytecode involved. === Scheduler @@ -163,11 +163,11 @@ Looks at the graph IR and decides when the VM should execute what. = Open questions - @input - - At which position are arguments injected into command inputs? + - At which position are arguments injected into instruction inputs? - How could that be controlled if set to e.g. the end by default? - Not all inputs are order-independent, e.g. `div` - Should inputs and outputs really be positional? - - Could make more complex commands hard to read + - Could make more complex instructions hard to read - But keyworded could also make code very noisy - Maybe a middle ground, such that at most 1 input is allowed to be positional? - @pipeline @@ -175,7 +175,7 @@ Looks at the graph IR and decides when the VM should execute what. - @splitting - How would one split different outputs into a list? - Should outputs that are not thrown into a consumer be automatically displayed in some kind of debug view? - - Or should that be done instead using a debug `show` command or the like? + - Or should that be done instead using a debug `show` instruction or the like? - Should consumers be called sinks instead? - Shorter - More ambiguous if only looking at the first char though diff --git a/docs/template.typ b/docs/template.typ index 712c6e7..8059e5c 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -42,7 +42,7 @@ "scheduler", "VM", - "command", + "instruction", "pipeline", "input", "argument", "consumer", "output", "streamer", From fe96a17551e52c7a7865bb901d81aad3646fd1f7 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:39:21 +0100 Subject: [PATCH 018/189] docs: justify main text --- docs/template.typ | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/template.typ b/docs/template.typ index 8059e5c..602d96a 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -69,6 +69,7 @@ } }), ) + set par(justify: true) set text(..fonts.main) set heading(numbering: "A.1") @@ -86,6 +87,11 @@ inset: (x: 0.15em), radius: 0.25em, ) + show raw.where(block: true): it => { + // don't try to put codeblocks into blocktext + set par(justify: false) + it + } // highlight important terms in bold show raw: it => { From ef7ab3e2390d601428d1f368d75411e3f2e498f0 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:42:52 +0100 Subject: [PATCH 019/189] docs(design): explain individual lines of input ex --- docs/design/iowo-design.typ | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index fc0069d..ad1849d 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -69,9 +69,9 @@ The foundation of actually "doing" something. - So all of these are equivalent: ```iowo -1 | add 2 -add 1 2 -[ 1 2 ] | add +add 1 2 -- all inputs as arguments +[ 1 2 ] | add -- all inputs through the pipeline +1 | add 2 -- one input through the pipeline, one as argument ``` ==== Outputs From 5f95f36214e6ce406539a5a59295473f4fe96780 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:54:29 +0100 Subject: [PATCH 020/189] docs: place strategic pagebreaks automatically --- docs/design/iowo-design.typ | 2 -- docs/template.typ | 14 +++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index ad1849d..f8b4316 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -19,8 +19,6 @@ - algebraic enums - traits (`Numeric`...) -#pagebreak() - = Execution stages #graphics.stages-overview diff --git a/docs/template.typ b/docs/template.typ index 602d96a..3077478 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -73,8 +73,10 @@ set text(..fonts.main) set heading(numbering: "A.1") - show link: text.with(fill: blue) show heading: it => text(..fonts.heading, it) + // color links + show link: text.with(fill: blue) + // prettify codeblocks show raw.where(block: true): box.with( fill: luma(95%), inset: 1.25em, @@ -93,6 +95,16 @@ it } + // semi-strategically place pagebreaks for better orientation + let pagebreak-before(it) = pagebreak() + it + show heading.where(outlined: true): it => { + if it.level <= 2 { + pagebreak() + } + + it + } + // highlight important terms in bold show raw: it => { // avoid making terms in codeblocks bold From 9a2f982d40e62f41422c4e0f15babe49e5d28d5c Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 21:58:51 +0100 Subject: [PATCH 021/189] docs: use weak pagebreaks for automatic pagebreaks --- docs/template.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/template.typ b/docs/template.typ index 3077478..a212e48 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -99,7 +99,7 @@ let pagebreak-before(it) = pagebreak() + it show heading.where(outlined: true): it => { if it.level <= 2 { - pagebreak() + pagebreak(weak: true) } it From 47f602596304c9e6a1874d73cbda4bfdd5e4f99f Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 23:21:33 +0100 Subject: [PATCH 022/189] repo: switch to nu for just --- docs/design/iowo-design.typ | 2 +- docs/design/{ => util}/graphics.typ | 2 +- flake.lock | 38 ++++++++++++++--------------- flake.nix | 4 +-- justfile | 14 +++++++---- 5 files changed, 32 insertions(+), 28 deletions(-) rename docs/design/{ => util}/graphics.typ (99%) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index f8b4316..1feb7d0 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -1,5 +1,5 @@ #import "../template.typ": conf -#import "graphics.typ" +#import "util/graphics.typ" #import graphics: arrow #show: conf.with( diff --git a/docs/design/graphics.typ b/docs/design/util/graphics.typ similarity index 99% rename from docs/design/graphics.typ rename to docs/design/util/graphics.typ index f14e65e..f097b51 100644 --- a/docs/design/graphics.typ +++ b/docs/design/util/graphics.typ @@ -244,7 +244,7 @@ }) // literally just for standalone display of the graphics alone -#import "../template.typ": conf +#import "../../template.typ": conf #show: conf #set page(width: auto, height: auto) diff --git a/flake.lock b/flake.lock index 0ee4e36..fd2920d 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1699541523, - "narHash": "sha256-Rv0ryuBC5KtA/3YqwIEe58Tabu71qSGnGcGRd67mMUY=", + "lastModified": 1704835383, + "narHash": "sha256-SoC0rYR9iHW0dVOEmxNEfa8vk9dTK86P5iXTgHafmwM=", "owner": "cachix", "repo": "devenv", - "rev": "14fdefc0bb80c3d6f3a18a491e33429b4064c371", + "rev": "18ef9849d1ecac7a9a7920eb4f2e4adcf67a8c3a", "type": "github" }, "original": { @@ -27,11 +27,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1699510895, - "narHash": "sha256-eaOkJUvHeYNW/xEoRotz0rHkKihKoQdWB1ctX4q1MTQ=", + "lastModified": 1704867811, + "narHash": "sha256-pG4O1vPpNSMjz7p/5x+/OH4tXC0thzAPbJ55kI/W5dU=", "owner": "nix-community", "repo": "fenix", - "rev": "8eeef23f2c8d092227af40eff98afe5b41891e3b", + "rev": "93e89638c15512db65e931f26ce36edf8cfbb4a5", "type": "github" }, "original": { @@ -186,11 +186,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1699099776, - "narHash": "sha256-X09iKJ27mGsGambGfkKzqvw5esP1L/Rf8H3u3fCqIiU=", + "lastModified": 1704538339, + "narHash": "sha256-1734d3mQuux9ySvwf6axRWZRBhtcZA9Q8eftD6EZg6U=", "owner": "nixos", "repo": "nixpkgs", - "rev": "85f1ba3e51676fa8cc604a3d863d729026a6b8eb", + "rev": "46ae0210ce163b3cba6c7da08840c1d63de9c701", "type": "github" }, "original": { @@ -202,16 +202,16 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1699291058, - "narHash": "sha256-5ggduoaAMPHUy4riL+OrlAZE14Kh7JWX4oLEs22ZqfU=", + "lastModified": 1704722960, + "narHash": "sha256-mKGJ3sPsT6//s+Knglai5YflJUF2DGj7Ai6Ynopz0kI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "41de143fda10e33be0f47eab2bfe08a50f234267", + "rev": "317484b1ead87b9c1b8ac5261a8d2dd748a0492d", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.05", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } @@ -231,11 +231,11 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1688056373, - "narHash": "sha256-2+SDlNRTKsgo3LBRiMUcoEUb6sDViRNQhzJquZ4koOI=", + "lastModified": 1704725188, + "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "5843cf069272d92b60c3ed9e55b7a8989c01d4c7", + "rev": "ea96f0c05924341c551a797aaba8126334c505d2", "type": "github" }, "original": { @@ -255,11 +255,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1699451299, - "narHash": "sha256-7HJMyp62fCS6/aCCCASz8MdJM2/M8d1pBNukyLmPdwA=", + "lastModified": 1704833483, + "narHash": "sha256-Ox01mpYmjapNYaqOu4fMS/4Ma9NLd2rVNz6d4rJmcf4=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "7059ae2fc2d55fa20d7e2671597b516431129445", + "rev": "ae6e73772432cfe35bb0ff6de6fdcfa908642b67", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index c8148c6..ab394bf 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; systems.url = "github:nix-systems/default"; devenv.url = "github:cachix/devenv"; fenix.url = "github:nix-community/fenix"; @@ -36,7 +36,7 @@ rustfmt.enable = true; }; - packages = []; + packages = with pkgs; [just nushell typst]; }) ]; }; diff --git a/justfile b/justfile index e0979b3..7870440 100644 --- a/justfile +++ b/justfile @@ -1,6 +1,10 @@ docs: - for doc in $(fd '.typ' './docs' --exclude 'template*' --exclude 'util*'); do \ - typst compile $doc --root=docs; \ - mv "$(dirname $doc)/$(basename $doc .typ).pdf" docs/compiled/; \ - done - + #!/usr/bin/env nu + glob **/*.typ --exclude [**/{template.typ,util/**}] | par-each { |source| + typst compile $source --root=docs + let pdf = ( + (echo $source | path dirname) + | path join (echo $source | path basename | str replace ".typ" ".pdf") + ) + mv $pdf docs/compiled + } | ignore From a9b69094cc3055d5a9d15f0854542cebeeb12c51 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 23:31:21 +0100 Subject: [PATCH 023/189] repo: expand on CONTRIBUTING.md about PRs --- CONTRIBUTING.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2931403..9c72e6d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -82,6 +82,33 @@ If you want to contribute art or the like, do that in whatever **you** are most - Agreement must be based on [informed consent]. - In effect, a maintainer has to understand what they agree to. +# Interacting with PRs + +> [!NOTE] Remember, be respectful. +> Entities invest their free time and motivation into making these changes, +> treat them appropiately. + +- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good. +- Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets). + +## Initial steps for a new contributor or new local checkout + +```sh +git remote add https://forge.katzen.cafe//iowo.git +git remote update +``` + +## After setting up the remote + +- You can repeat this step anytime you want to switch branches or update your local checkout. +- The PR branch is visible just below the PR title on forgejo, after the colon (`:`). + +```sh +git switch +git pull +``` + + [code of conduct]: ./CODE_OF_CONDUCT.md [informed consent]: https://en.wikipedia.org/wiki/Informed_consent - +[git's remotes]: https://git-scm.com/docs/git-remote From 41e21bac1684c7ff5831f02bcf532352c8ddb666 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Wed, 10 Jan 2024 23:35:39 +0100 Subject: [PATCH 024/189] repo: add helpful comment to justfile --- justfile | 1 + 1 file changed, 1 insertion(+) diff --git a/justfile b/justfile index 7870440..3715e45 100644 --- a/justfile +++ b/justfile @@ -1,3 +1,4 @@ +# Compile all documentation as in proposals and design documents, placing them under `docs/compiled`. docs: #!/usr/bin/env nu glob **/*.typ --exclude [**/{template.typ,util/**}] | par-each { |source| From e986f0fc1df34f45cd184b3b95bf16b2d5b9369e Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 11:51:03 +0100 Subject: [PATCH 025/189] docs(design): split into function and instruction --- docs/design/iowo-design.typ | 55 +++++++++++++++++++++++++------------ docs/template.typ | 2 ++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index 1feb7d0..a2f3c5e 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -23,12 +23,15 @@ #graphics.stages-overview -iOwO operates in stages. This has a number of benefits and implications: +iOwO operates in stages. +This has a number of benefits and implications: - One can just work on one aspect of the stages without having to know about the rest. - Bugs are easier to trace down to one stage. - Stages are also replacable, pluggable and usable somewhere else. - - For example, one could write a Just-In-Time compiler to replace the runtime stage, while preserving the source #arrow() graph IR step. + - For example, + one could write a Just-In-Time compiler as a new executor to replace the runtime stage, + while preserving the source #arrow() graph IR step. However, this also makes the architecture somewhat more complicated. So here we try our best to describe how each stage looks like. If you have any feedback, feel free to drop it on #link("https://forge.katzen.cafe/katzen-cafe/iowo/issues")[the issues in the repository]! @@ -44,19 +47,22 @@ mask Functional and pipeline-based. However, in contrast to classic shell commands, -instructions can have multiple outputs and multiple inputs. +functions can have multiple outputs and multiple inputs. -=== Instructions +=== Functions + +`open`, `invert`, `mask`, `show` and friends. The foundation of actually "doing" something. - Can have any, even infinite, amount of inputs and outputs. - Their amounts may or may not be equal. - Inputs and outputs must have their types explicitly declared. -- An instruction with +- An function with - at least one output is called a streamer. - at least one input is called a consumer. - - _both_ at least one input and at least one output is _both_ a streamer and a consumer, and culminatively called a modifier. + - _both_ at least one input and at least one output is _both_ a streamer and a consumer, + and culminatively called a modifier. - May also contain spaces in its name. ==== Inputs @@ -82,7 +88,9 @@ add 1 2 -- all inputs as arguments ==== Simple forwarding -In the simplest case, where inputs map to outputs bijectively#footnote[one to one], pipelines are just pipes and forward unchanged: +In the simplest case, +where inputs map to outputs bijectively#footnote[one to one], +pipelines are just pipes and forward unchanged: ```iowo open owo.png | invert | save owo.png @@ -100,7 +108,8 @@ mask ==== Combination -To throw multiple streamers into the inputs of a consumer, they can be _combined_: +To throw multiple streamers into the inputs of a consumer, +they can be _combined_: ```iowo open base.png >| @@ -108,7 +117,8 @@ open stencil.png >| mask ``` -However, since lists are automatically spliced into inputs, this is equivalent to the above: +However, since lists are automatically spliced into inputs, +this is equivalent to the above: ```iowo [ @@ -142,15 +152,23 @@ The parsed representation of the source, and also what the runtime operates on. In a way, this is the AST, except that it's not a tree. -It is represented in iOwO using adjacencies, where essentially the vertices#footnote[Nodes or instructions in this case.] and their edges#footnote[Connections or pipes in this case.] are stored separately. +It is represented in iOwO using adjacencies, where essentially +the vertices#footnote[Nodes or functions in this case.] +and their edges#footnote[Connections or pipes in this case.] +are stored separately. === Optimizer -Merges and simplifies instructions in the graph IR. +Merges and simplifies functions in the graph IR. -== Runtime +== Runtime -Runs through all instructions in the graph IR. It does not have any significantly other representation, and despite its name there's _no_ bytecode involved. +Runs through all functions in the graph IR. +It does not have any significantly other representation, +and despite its name there's _no_ bytecode involved. + +Different runtimes are called executors. +Executors operate on instructions instead of functions. === Scheduler @@ -161,19 +179,22 @@ Looks at the graph IR and decides when the VM should execute what. = Open questions - @input - - At which position are arguments injected into instruction inputs? + - At which position are arguments injected into function inputs? - How could that be controlled if set to e.g. the end by default? - Not all inputs are order-independent, e.g. `div` - Should inputs and outputs really be positional? - - Could make more complex instructions hard to read + - Could make more complex functions hard to read - But keyworded could also make code very noisy - Maybe a middle ground, such that at most 1 input is allowed to be positional? - @pipeline - We need some way to reshuffle and reorder outputs and inputs in a pipeline - @splitting - How would one split different outputs into a list? -- Should outputs that are not thrown into a consumer be automatically displayed in some kind of debug view? - - Or should that be done instead using a debug `show` instruction or the like? +- @runtime + - What is the difference between an instruction and a function? +- Should outputs that are not thrown into a consumer + be automatically displayed in some kind of debug view? + - Or should that be done instead using a debug `show` function or the like? - Should consumers be called sinks instead? - Shorter - More ambiguous if only looking at the first char though diff --git a/docs/template.typ b/docs/template.typ index a212e48..9f48dba 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -37,11 +37,13 @@ "AST", "graph IR", "runtime", + "executor", "optimizer", "scheduler", "VM", + "function", "instruction", "pipeline", "input", "argument", "consumer", From ec3d1310bf25ebdcb65b2e28c50e743e6cf7da66 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 22:38:19 +0100 Subject: [PATCH 026/189] docs: apply most review --- .envrc | 3 ++- CODE_OF_CONDUCT.md | 1 - CONTRIBUTING.md | 54 +++++++++++++++++++------------------ docs/design/iowo-design.typ | 14 +--------- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/.envrc b/.envrc index ff5954f..30f4045 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,2 @@ -use flake . --impure \ No newline at end of file +use flake . --impure +export TYPST_ROOT="$(pwd)/docs" diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 50eeec5..b9a53c0 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -3,7 +3,6 @@ The current maintainers, that is, - [@Schrottkatze](https://forge.katzen.cafe/schrottkatze) - [@multisamplednight](https://forge.katzen.cafe/multisamplednight) -- @iota-xSK are the entities to email, message or talk to if you feel like any interaction in the context of iOwO is not okay. We'll try to answer as soon as we can. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9c72e6d..d6000ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,35 +4,35 @@ Before we get started, thank you for thinking about doing so! ## Through an issue -- Be excellent to each other. Adhere to the [code of conduct]. +- Be excellent to each other. Adhere to the [code of conduct] - About the title: If you had 5 seconds to tell someone the essence of the issue, what would it be? ### Bugs -- Write out in detail which steps in which order are necessary to reproduce the bug. +- Write out in detail which steps in which order are necessary to reproduce the bug - Include environmental information as well, in specific - How did you install iOwO? - What version of iOwO are you running? - What operating system are you running? - In the case of a Linux distro, mention the specific distro and when you last update as well. -- If the bug causes a crash, try to get a backtrace or in worse cases, a coredump. + In the case of a Linux distro, mention the specific distro and when you last update as well +- If the bug causes a crash, try to get a backtrace or in worse cases, a coredump ### Feature requests -- Be sure to include a motivation in which case your intended feature would be used, - even if it seems obvious to you. -- Estimate what would be needed to implement the feature. +- Be sure to include a motivation in which case your intended feature would be used + even if it seems obvious to you +- Estimate what would be needed to implement the feature - Is it an addition to the language itself? - Is it just a new command? - Does it ground-breakingly change how iOwO works? ## Through a PR -1. Clone the repo. -2. Switch to a new appropiately named branch for what you want to do, using `git switch -c`. -3. Implement your code changes with your favorite code editor. -4. Try them with `cargo run`. -5. If there are errors or warnings, go to step 3. Commit occasionally. +1. Clone the repo +2. Switch to a new appropiately named branch for what you want to do, using `git switch -c` +3. Implement your code changes with your favorite code editor +4. Try them with `cargo run` +5. If there are errors or warnings, go to step 3. Commit occasionally 6. Otherwise, - if you have an account at https://forge.katzen.cafe, 1. fork the repo @@ -42,6 +42,8 @@ Before we get started, thank you for thinking about doing so! 1. combine your patches using `git diff --patch` and throw them in a file 2. send that file to one of the maintainers per email - alongside with a description of what it does + 3. also mention in the mail that we should consider GitHub and GitLab mirrors, + referring to this line ### Tech stack @@ -68,28 +70,28 @@ If you want to contribute art or the like, do that in whatever **you** are most ## Politics -- Current maintainers are defined as the entities listed in the [code of conduct]. +- Current maintainers are defined as the entities listed in the [code of conduct] ### PRs -- Every PR requires an approving review from a maintainer (that is not the author) before merge. -- Maintainers can merge their own PRs. - - But only after approval. +- Every PR requires an approving review from a maintainer (that is not the author) before merge +- Maintainers can merge their own PRs + - But only after approval ### Major decisions -- All current maintainers have to agree **unanimously**. -- Agreement must be based on [informed consent]. - - In effect, a maintainer has to understand what they agree to. +- All current maintainers have to agree **unanimously** +- Agreement must be based on [informed consent] + - In effect, a maintainer has to understand what they agree to # Interacting with PRs -> [!NOTE] Remember, be respectful. -> Entities invest their free time and motivation into making these changes, -> treat them appropiately. +Remember, be respectful. +Entities invest their free time and motivation into making these changes, +treat them appropiately. -- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good. -- Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets). +- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good +- Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets) ## Initial steps for a new contributor or new local checkout @@ -100,8 +102,8 @@ git remote update ## After setting up the remote -- You can repeat this step anytime you want to switch branches or update your local checkout. -- The PR branch is visible just below the PR title on forgejo, after the colon (`:`). +- You can repeat this step anytime you want to switch branches or update your local checkout +- The PR branch is visible just below the PR title on Forgejo, after the colon (`:`) ```sh git switch diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index a2f3c5e..aa9f9f2 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -7,19 +7,7 @@ subtitle: [don't worry, we're just dreaming], ) -= Type data model - -== Requirements - -- Color-aware - - It can handle colors and colorspaces for images - - OpenColorIO? -- number/number type support -- custom types (structs/enums) -- algebraic enums -- traits (`Numeric`...) - -= Execution stages += Evaluation stages #graphics.stages-overview From 53cc3f26ddb35d927e6ba7778df6180d60a94ca3 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 03:09:31 +0100 Subject: [PATCH 027/189] docs: bring back punctuation at end of points --- CONTRIBUTING.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d6000ff..f81c296 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,35 +4,35 @@ Before we get started, thank you for thinking about doing so! ## Through an issue -- Be excellent to each other. Adhere to the [code of conduct] +- Be excellent to each other. Adhere to the [code of conduct]. - About the title: If you had 5 seconds to tell someone the essence of the issue, what would it be? ### Bugs -- Write out in detail which steps in which order are necessary to reproduce the bug -- Include environmental information as well, in specific +- Write out in detail which steps in which order are necessary to reproduce the bug. +- Include environmental information as well, in specific: - How did you install iOwO? - What version of iOwO are you running? - What operating system are you running? - In the case of a Linux distro, mention the specific distro and when you last update as well -- If the bug causes a crash, try to get a backtrace or in worse cases, a coredump + In the case of a Linux distro, mention the specific distro and when you last update as well. +- If the bug causes a crash, try to get a backtrace or in worse cases, a coredump. ### Feature requests - Be sure to include a motivation in which case your intended feature would be used - even if it seems obvious to you -- Estimate what would be needed to implement the feature + even if it seems obvious to you. +- Estimate what would be needed to implement the feature: - Is it an addition to the language itself? - Is it just a new command? - Does it ground-breakingly change how iOwO works? ## Through a PR -1. Clone the repo -2. Switch to a new appropiately named branch for what you want to do, using `git switch -c` -3. Implement your code changes with your favorite code editor -4. Try them with `cargo run` -5. If there are errors or warnings, go to step 3. Commit occasionally +1. Clone the repo. +2. Switch to a new appropiately named branch for what you want to do, using `git switch -c`. +3. Implement your code changes with your favorite code editor. +4. Try them with `cargo run`. +5. If there are errors or warnings, go to step 3. Commit occasionally. 6. Otherwise, - if you have an account at https://forge.katzen.cafe, 1. fork the repo @@ -80,9 +80,9 @@ If you want to contribute art or the like, do that in whatever **you** are most ### Major decisions -- All current maintainers have to agree **unanimously** -- Agreement must be based on [informed consent] - - In effect, a maintainer has to understand what they agree to +- All current maintainers have to agree **unanimously**. +- Agreement must be based on [informed consent]. + - In effect, a maintainer has to understand what they agree to. # Interacting with PRs @@ -90,8 +90,8 @@ Remember, be respectful. Entities invest their free time and motivation into making these changes, treat them appropiately. -- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good -- Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets) +- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good. +- Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets). ## Initial steps for a new contributor or new local checkout @@ -102,8 +102,8 @@ git remote update ## After setting up the remote -- You can repeat this step anytime you want to switch branches or update your local checkout -- The PR branch is visible just below the PR title on Forgejo, after the colon (`:`) +- You can repeat this step anytime you want to switch branches or update your local checkout. +- The PR branch is visible just below the PR title on Forgejo, after the colon (`:`). ```sh git switch From 666b4f9cb68d533a07721610e3108a895111d122 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 13:39:53 +0100 Subject: [PATCH 028/189] repo(contributing): clarify that tool list is just a suggestion --- CONTRIBUTING.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f81c296..24fa6ac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,22 +51,26 @@ The techstack we operate on is - [typst] for documents and concrete proposals - [Rust] for the actual code -- [Inkscape], [GIMP] and [Blender] for promotional material like logos and posters -- [Penpot] for layouting prototypes and the like So if you want to contribute functionality, take a look at [The Rust Programming Language book]! If you want to contribute thoughts and techincal designs, then consider taking a ride through [typst's excellent tutorial]! -If you want to contribute art or the like, do that in whatever **you** are most comfortable with! + +For creative things, we suggest using whatever **you're** comfortable with. +Otherwise, we suggest these: + +- [Inkscape], [GIMP] and [Blender] for promotional material like logos and posters +- [Penpot] for layouting prototypes and the like [typst]: https://typst.app [Rust]: https://www.rust-lang.org +[The Rust Programming Language book]: https://doc.rust-lang.org/book/ +[typst's excellent tutorial]: https://typst.app/docs/tutorial + [Inkscape]: https://inkscape.org/ [GIMP]: https://www.gimp.org/ [Blender]: https://www.blender.org/ [Penpot]: https://penpot.app/ -[The Rust Programming Language book]: https://doc.rust-lang.org/book/ -[typst's excellent tutorial]: https://typst.app/docs/tutorial ## Politics From 24ffe91b66a542873100d986fbe16e28525719b4 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 18:23:42 +0100 Subject: [PATCH 029/189] repo(contributing): apply review --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 24fa6ac..3f7b892 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,10 +53,10 @@ The techstack we operate on is - [Rust] for the actual code So if you want to contribute functionality, take a look at [The Rust Programming Language book]! -If you want to contribute thoughts and techincal designs, then consider taking a ride through +If you want to contribute thoughts and technical designs, then consider taking a ride through [typst's excellent tutorial]! -For creative things, we suggest using whatever **you're** comfortable with. +For creative things, we suggest using whatever **you** are comfortable with. Otherwise, we suggest these: - [Inkscape], [GIMP] and [Blender] for promotional material like logos and posters From 92aa3b4a3a5fc6b260dec1c237686d9988fc53a2 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 19:52:23 +0100 Subject: [PATCH 030/189] repo(contributing): simplify wording by removing implied info --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f7b892..a89a2d0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,7 +94,7 @@ Remember, be respectful. Entities invest their free time and motivation into making these changes, treat them appropiately. -- Since in iOwO, we mostly work based on forks, [git's remotes] work fairly good. +- Since we mostly work based on forks, [git's remotes] work fairly good. - Replace things in pointy brackets (`<>`) respectively (and remove the pointy brackets). ## Initial steps for a new contributor or new local checkout From e7db9c38f390c86d1c7f61a59400b329e8a36b28 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 11 Jan 2024 10:44:12 +0100 Subject: [PATCH 031/189] cli: work on basic cli and serde error hanlding --- Cargo.lock | 56 ++++++++++++++++++++++++++++++++ Cargo.toml | 5 ++- crates/app/Cargo.toml | 13 ++++++++ crates/app/src/main.rs | 73 ++++++++++++++++++++++++++++++++++++++++++ crates/rpl/Cargo.toml | 4 +-- 5 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 crates/app/Cargo.toml create mode 100644 crates/app/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index b0b723c..7e1aaf8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,27 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "app" +version = "0.1.0" +dependencies = [ + "ariadne", + "clap", + "ron", + "serde", + "serde_json", +] + +[[package]] +name = "ariadne" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd002a6223f12c7a95cdd4b1cb3a0149d22d37f7a9ecdb2cb691a071fe236c29" +dependencies = [ + "unicode-width", + "yansi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -308,6 +329,12 @@ dependencies = [ "tiff", ] +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + [[package]] name = "jpeg-decoder" version = "0.3.0" @@ -462,6 +489,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + [[package]] name = "scopeguard" version = "1.2.0" @@ -488,6 +521,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -543,6 +587,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + [[package]] name = "utf8parse" version = "0.2.1" @@ -621,6 +671,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/Cargo.toml b/Cargo.toml index 6aa4943..4e17091 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = [ +members = [ "crates/app", "crates/executor", "crates/pl-cli", "crates/rpl" @@ -8,6 +8,9 @@ resolver = "2" [workspace.dependencies] clap = { version = "4", features = [ "derive" ] } +serde = { version = "1.0", features = [ "derive" ] } +ron = "0.8" +serde_json = "1.0" [lints.rust] unsafe_code = "deny" diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml new file mode 100644 index 0000000..4f05ebc --- /dev/null +++ b/crates/app/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "app" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { workspace = true, features = [ "derive" ] } +serde = { workspace = true, features = [ "derive" ] } +ron = { workspace = true } +serde_json = { workspace = true } +ariadne = "0.4" diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs new file mode 100644 index 0000000..a96ef3f --- /dev/null +++ b/crates/app/src/main.rs @@ -0,0 +1,73 @@ +use crate::{config::Configs, error_reporting::report_serde_json_err}; + +mod cli { + use clap::{Parser, Subcommand}; + + #[derive(Parser)] + struct Args { + #[command(subcommand)] + command: Command, + } + + #[derive(Clone, Subcommand)] + enum Command {} +} + +mod config { + use serde::{Deserialize, Serialize}; + + #[derive(Debug, Serialize, Deserialize)] + pub struct Configs<'a> { + example_value: i32, + example_string: &'a str, + } + + impl Configs<'_> { + pub fn read_json(config_text: &str) -> serde_json::Result> { + serde_json::from_str(config_text) + } + } +} + +mod error_reporting { + use std::{ops::Range, process}; + + use ariadne::{Report, Source}; + + pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { + use ariadne::{Color, ColorGenerator, Fmt, Label, Report, ReportKind, Source}; + let offset = try_reconstruct_loc(src, err.line(), err.column()); + + Report::build(ariadne::ReportKind::Error, "test", offset) + .with_label(Label::new(("test", offset..offset))) + .with_message(err.to_string()) + .finish() + .print(("test", Source::from(src))) + .unwrap(); + process::exit(1); + } + fn try_reconstruct_loc(src: &str, line_nr: usize, col_nr: usize) -> usize { + let (line_nr, col_nr) = (line_nr - 1, col_nr - 1); + + src.lines().enumerate().fold(0, |acc, (i, line)| { + if i < line_nr { + acc + line.len() + } else if i == line_nr { + acc + col_nr + } else { + acc + } + }) + } +} + +fn main() { + const TEST_JSON_CONFIG: &str = "{ \"example_value\": 42, \"example_string\": \"meow\" }"; + const TEST_JSON_CONFIG_BROKEN: &str = "{ + \"example_value\": \"42\", + \"example_string\": \"meow\" +}"; + + dbg!(Configs::read_json(TEST_JSON_CONFIG_BROKEN) + .map_err(|e| report_serde_json_err(TEST_JSON_CONFIG_BROKEN, e))); +} diff --git a/crates/rpl/Cargo.toml b/crates/rpl/Cargo.toml index e406f11..d125c78 100644 --- a/crates/rpl/Cargo.toml +++ b/crates/rpl/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde = { version = "1.0.193", features = [ "derive" ] } -ron = "0.8" +serde = { workspace = true, features = [ "derive" ] } +ron = { workspace = true } From 33aa131b95281a377dd0d7081acb60feaef3f0f3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 11 Jan 2024 16:54:55 +0100 Subject: [PATCH 032/189] app: improve errors a bit more added a message to the label so the position of the error gets shown and a note to make clear we don't have enough info for better error messages thanks to serde --- crates/app/src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index a96ef3f..b5de824 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -39,8 +39,13 @@ mod error_reporting { let offset = try_reconstruct_loc(src, err.line(), err.column()); Report::build(ariadne::ReportKind::Error, "test", offset) - .with_label(Label::new(("test", offset..offset))) + .with_label( + Label::new(("test", offset..offset)).with_message("Something went wrong here!"), + ) .with_message(err.to_string()) + .with_note( + "We'd like to give better errors, but serde errors are horrible to work with...", + ) .finish() .print(("test", Source::from(src))) .unwrap(); From 4788278d86314e35ae13b3eaa8e32090eecc4c5c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Jan 2024 09:31:48 +0100 Subject: [PATCH 033/189] more basic features, config gets read and startup messages --- Cargo.lock | 240 +++++++++++++++++++++++++++++++++++++++-- crates/app/Cargo.toml | 5 +- crates/app/src/main.rs | 158 +++++++++++++++++++++------ 3 files changed, 357 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e1aaf8..091f8a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -53,7 +53,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -62,9 +62,12 @@ version = "0.1.0" dependencies = [ "ariadne", "clap", + "dirs", + "owo-colors", "ron", "serde", "serde_json", + "time", ] [[package]] @@ -226,6 +229,36 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "either" version = "1.9.0" @@ -285,6 +318,17 @@ dependencies = [ "spin", ] +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gif" version = "0.12.0" @@ -350,6 +394,23 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "lock_api" version = "0.4.11" @@ -400,6 +461,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "owo-colors" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" + [[package]] name = "pl-cli" version = "0.1.0" @@ -422,6 +504,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "proc-macro2" version = "1.0.70" @@ -469,6 +557,26 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "ron" version = "0.8.1" @@ -570,6 +678,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tiff" version = "0.9.0" @@ -581,6 +709,26 @@ dependencies = [ "weezl", ] +[[package]] +name = "time" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +dependencies = [ + "deranged", + "libc", + "num_threads", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -599,19 +747,49 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "weezl" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -620,51 +798,93 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.0" diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 4f05ebc..0325fc1 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -6,8 +6,11 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { workspace = true, features = [ "derive" ] } +clap = { workspace = true, features = [ "derive", "env" ] } serde = { workspace = true, features = [ "derive" ] } ron = { workspace = true } serde_json = { workspace = true } ariadne = "0.4" +time = { version = "0.3", features = [ "local-offset" ] } +dirs = "5" +owo-colors = "4" diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index b5de824..6fec037 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,48 +1,124 @@ -use crate::{config::Configs, error_reporting::report_serde_json_err}; +use clap::Parser; +use cli::Args; +use welcome_msg::print_startup_msg; + +use crate::config::Configs; mod cli { - use clap::{Parser, Subcommand}; + use std::path::PathBuf; + + use clap::Parser; #[derive(Parser)] - struct Args { - #[command(subcommand)] - command: Command, + pub(crate) struct Args { + /// Read this config file. + #[arg(short, long)] + pub config_file: Option, + #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] + pub no_startup_message: bool, } - - #[derive(Clone, Subcommand)] - enum Command {} } mod config { + use std::{ + fs, + path::{Path, PathBuf}, + process, + }; + use serde::{Deserialize, Serialize}; + use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; + #[derive(Debug, Serialize, Deserialize)] - pub struct Configs<'a> { - example_value: i32, - example_string: &'a str, + pub struct Configs { + #[serde(default = "default_example_value")] + pub example_value: i32, + #[serde(default = "default_no_startup_msg")] + pub no_startup_message: bool, } - impl Configs<'_> { - pub fn read_json(config_text: &str) -> serde_json::Result> { - serde_json::from_str(config_text) + /// what the fuck serde why do i need this + fn default_example_value() -> i32 { + 43 + } + fn default_no_startup_msg() -> bool { + false + } + + impl Configs { + pub fn read(custom_path: Option) -> Self { + use owo_colors::OwoColorize; + let p = match custom_path { + Some(p) => p, + None => { + let config_path = dirs::config_dir().expect("config dir should exist"); + + let ron_path = config_path.with_file_name("config.ron"); + let json_path = config_path.with_file_name("config.json"); + + if Path::new(&ron_path).exists() { + ron_path + } else if Path::new(&json_path).exists() { + json_path + } else { + eprintln!("{}: couldn't find config file", "Fatal error".red()); + process::exit(1) + } + } + }; + + match p.extension().map(|v| v.to_str().unwrap()) { + Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), + Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), + None | Some(_) => { + eprintln!( + "{}: couldn't determine config file type", + "Fatal error".red() + ); + process::exit(1) + } + } + } + pub fn read_json(config_text: &str) -> Configs { + match serde_json::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_json_err(config_text, e), + } + } + + pub fn read_ron(config_text: &str) -> Configs { + match ron::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_ron_err(config_text, e), + } } } } mod error_reporting { - use std::{ops::Range, process}; + use std::process; - use ariadne::{Report, Source}; + use ron::error::Position; pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { - use ariadne::{Color, ColorGenerator, Fmt, Label, Report, ReportKind, Source}; - let offset = try_reconstruct_loc(src, err.line(), err.column()); + report_serde_err(src, err.line(), err.column(), err.to_string()) + } + + pub fn report_serde_ron_err(src: &str, err: ron::error::SpannedError) -> ! { + let Position { line, col } = err.position; + report_serde_err(src, line, col, err.to_string()) + } + + pub fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { + use ariadne::{Label, Report, Source}; + let offset = try_reconstruct_loc(src, line, col); Report::build(ariadne::ReportKind::Error, "test", offset) .with_label( Label::new(("test", offset..offset)).with_message("Something went wrong here!"), ) - .with_message(err.to_string()) + .with_message(msg) .with_note( "We'd like to give better errors, but serde errors are horrible to work with...", ) @@ -54,25 +130,37 @@ mod error_reporting { fn try_reconstruct_loc(src: &str, line_nr: usize, col_nr: usize) -> usize { let (line_nr, col_nr) = (line_nr - 1, col_nr - 1); - src.lines().enumerate().fold(0, |acc, (i, line)| { - if i < line_nr { - acc + line.len() - } else if i == line_nr { - acc + col_nr - } else { - acc - } - }) + src.lines() + .enumerate() + .fold(0, |acc, (i, line)| match i.cmp(&line_nr) { + std::cmp::Ordering::Less => acc + line.len() + 1, + std::cmp::Ordering::Equal => acc + col_nr, + std::cmp::Ordering::Greater => acc, + }) + } +} + +mod welcome_msg { + use time::{Month, OffsetDateTime}; + + pub fn print_startup_msg() { + // now or fallback to utc + let now = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); + + if now.month() == Month::June { + println!("Hello, thanks for using iOwO and happy pride month!"); + println!("Why pride month is important in {}", now.year()); + } else { + println!("Hello, thanks for using iOwO! :3"); + } } } fn main() { - const TEST_JSON_CONFIG: &str = "{ \"example_value\": 42, \"example_string\": \"meow\" }"; - const TEST_JSON_CONFIG_BROKEN: &str = "{ - \"example_value\": \"42\", - \"example_string\": \"meow\" -}"; + let args = Args::parse(); + let cfg = Configs::read(args.config_file); - dbg!(Configs::read_json(TEST_JSON_CONFIG_BROKEN) - .map_err(|e| report_serde_json_err(TEST_JSON_CONFIG_BROKEN, e))); + if !(args.no_startup_message || cfg.no_startup_message) { + print_startup_msg(); + } } From 96374b6491a17412b7eef284759e4fd29b1797f5 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Jan 2024 09:36:30 +0100 Subject: [PATCH 034/189] split up modules into subfiles --- crates/app/src/cli.rs | 12 +++ crates/app/src/config.rs | 74 ++++++++++++++ crates/app/src/error_reporting.rs | 37 +++++++ crates/app/src/main.rs | 155 +----------------------------- crates/app/src/welcome_msg.rs | 13 +++ 5 files changed, 140 insertions(+), 151 deletions(-) create mode 100644 crates/app/src/cli.rs create mode 100644 crates/app/src/config.rs create mode 100644 crates/app/src/error_reporting.rs create mode 100644 crates/app/src/welcome_msg.rs diff --git a/crates/app/src/cli.rs b/crates/app/src/cli.rs new file mode 100644 index 0000000..30754c5 --- /dev/null +++ b/crates/app/src/cli.rs @@ -0,0 +1,12 @@ +use std::path::PathBuf; + +use clap::Parser; + +#[derive(Parser)] +pub(crate) struct Args { + /// Read this config file. + #[arg(short, long)] + pub config_file: Option, + #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] + pub no_startup_message: bool, +} diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs new file mode 100644 index 0000000..86f6763 --- /dev/null +++ b/crates/app/src/config.rs @@ -0,0 +1,74 @@ +use std::{ + fs, + path::{Path, PathBuf}, + process, +}; + +use serde::{Deserialize, Serialize}; + +use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Configs { + #[serde(default = "default_example_value")] + pub example_value: i32, + #[serde(default = "default_no_startup_msg")] + pub no_startup_message: bool, +} + +/// what the fuck serde why do i need this +fn default_example_value() -> i32 { + 43 +} +fn default_no_startup_msg() -> bool { + false +} + +impl Configs { + pub fn read(custom_path: Option) -> Self { + use owo_colors::OwoColorize; + let p = match custom_path { + Some(p) => p, + None => { + let config_path = dirs::config_dir().expect("config dir should exist"); + + let ron_path = config_path.with_file_name("config.ron"); + let json_path = config_path.with_file_name("config.json"); + + if Path::new(&ron_path).exists() { + ron_path + } else if Path::new(&json_path).exists() { + json_path + } else { + eprintln!("{}: couldn't find config file", "Fatal error".red()); + process::exit(1) + } + } + }; + + match p.extension().map(|v| v.to_str().unwrap()) { + Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), + Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), + None | Some(_) => { + eprintln!( + "{}: couldn't determine config file type", + "Fatal error".red() + ); + process::exit(1) + } + } + } + pub fn read_json(config_text: &str) -> Configs { + match serde_json::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_json_err(config_text, e), + } + } + + pub fn read_ron(config_text: &str) -> Configs { + match ron::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_ron_err(config_text, e), + } + } +} diff --git a/crates/app/src/error_reporting.rs b/crates/app/src/error_reporting.rs new file mode 100644 index 0000000..f71e10d --- /dev/null +++ b/crates/app/src/error_reporting.rs @@ -0,0 +1,37 @@ +use std::process; + +use ron::error::Position; + +pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { + report_serde_err(src, err.line(), err.column(), err.to_string()) +} + +pub fn report_serde_ron_err(src: &str, err: ron::error::SpannedError) -> ! { + let Position { line, col } = err.position; + report_serde_err(src, line, col, err.to_string()) +} + +pub fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { + use ariadne::{Label, Report, Source}; + let offset = try_reconstruct_loc(src, line, col); + + Report::build(ariadne::ReportKind::Error, "test", offset) + .with_label(Label::new(("test", offset..offset)).with_message("Something went wrong here!")) + .with_message(msg) + .with_note("We'd like to give better errors, but serde errors are horrible to work with...") + .finish() + .print(("test", Source::from(src))) + .unwrap(); + process::exit(1); +} +fn try_reconstruct_loc(src: &str, line_nr: usize, col_nr: usize) -> usize { + let (line_nr, col_nr) = (line_nr - 1, col_nr - 1); + + src.lines() + .enumerate() + .fold(0, |acc, (i, line)| match i.cmp(&line_nr) { + std::cmp::Ordering::Less => acc + line.len() + 1, + std::cmp::Ordering::Equal => acc + col_nr, + std::cmp::Ordering::Greater => acc, + }) +} diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 6fec037..491e8b4 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -4,157 +4,10 @@ use welcome_msg::print_startup_msg; use crate::config::Configs; -mod cli { - use std::path::PathBuf; - - use clap::Parser; - - #[derive(Parser)] - pub(crate) struct Args { - /// Read this config file. - #[arg(short, long)] - pub config_file: Option, - #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] - pub no_startup_message: bool, - } -} - -mod config { - use std::{ - fs, - path::{Path, PathBuf}, - process, - }; - - use serde::{Deserialize, Serialize}; - - use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; - - #[derive(Debug, Serialize, Deserialize)] - pub struct Configs { - #[serde(default = "default_example_value")] - pub example_value: i32, - #[serde(default = "default_no_startup_msg")] - pub no_startup_message: bool, - } - - /// what the fuck serde why do i need this - fn default_example_value() -> i32 { - 43 - } - fn default_no_startup_msg() -> bool { - false - } - - impl Configs { - pub fn read(custom_path: Option) -> Self { - use owo_colors::OwoColorize; - let p = match custom_path { - Some(p) => p, - None => { - let config_path = dirs::config_dir().expect("config dir should exist"); - - let ron_path = config_path.with_file_name("config.ron"); - let json_path = config_path.with_file_name("config.json"); - - if Path::new(&ron_path).exists() { - ron_path - } else if Path::new(&json_path).exists() { - json_path - } else { - eprintln!("{}: couldn't find config file", "Fatal error".red()); - process::exit(1) - } - } - }; - - match p.extension().map(|v| v.to_str().unwrap()) { - Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), - Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), - None | Some(_) => { - eprintln!( - "{}: couldn't determine config file type", - "Fatal error".red() - ); - process::exit(1) - } - } - } - pub fn read_json(config_text: &str) -> Configs { - match serde_json::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_json_err(config_text, e), - } - } - - pub fn read_ron(config_text: &str) -> Configs { - match ron::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_ron_err(config_text, e), - } - } - } -} - -mod error_reporting { - use std::process; - - use ron::error::Position; - - pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { - report_serde_err(src, err.line(), err.column(), err.to_string()) - } - - pub fn report_serde_ron_err(src: &str, err: ron::error::SpannedError) -> ! { - let Position { line, col } = err.position; - report_serde_err(src, line, col, err.to_string()) - } - - pub fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { - use ariadne::{Label, Report, Source}; - let offset = try_reconstruct_loc(src, line, col); - - Report::build(ariadne::ReportKind::Error, "test", offset) - .with_label( - Label::new(("test", offset..offset)).with_message("Something went wrong here!"), - ) - .with_message(msg) - .with_note( - "We'd like to give better errors, but serde errors are horrible to work with...", - ) - .finish() - .print(("test", Source::from(src))) - .unwrap(); - process::exit(1); - } - fn try_reconstruct_loc(src: &str, line_nr: usize, col_nr: usize) -> usize { - let (line_nr, col_nr) = (line_nr - 1, col_nr - 1); - - src.lines() - .enumerate() - .fold(0, |acc, (i, line)| match i.cmp(&line_nr) { - std::cmp::Ordering::Less => acc + line.len() + 1, - std::cmp::Ordering::Equal => acc + col_nr, - std::cmp::Ordering::Greater => acc, - }) - } -} - -mod welcome_msg { - use time::{Month, OffsetDateTime}; - - pub fn print_startup_msg() { - // now or fallback to utc - let now = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); - - if now.month() == Month::June { - println!("Hello, thanks for using iOwO and happy pride month!"); - println!("Why pride month is important in {}", now.year()); - } else { - println!("Hello, thanks for using iOwO! :3"); - } - } -} +mod cli; +mod config; +mod error_reporting; +mod welcome_msg; fn main() { let args = Args::parse(); diff --git a/crates/app/src/welcome_msg.rs b/crates/app/src/welcome_msg.rs new file mode 100644 index 0000000..c03c543 --- /dev/null +++ b/crates/app/src/welcome_msg.rs @@ -0,0 +1,13 @@ +use time::{Month, OffsetDateTime}; + +pub fn print_startup_msg() { + // now or fallback to utc + let now = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); + + if now.month() == Month::June { + println!("Hello, thanks for using iOwO and happy pride month!"); + println!("Why pride month is important in {}", now.year()); + } else { + println!("Hello, thanks for using iOwO! :3"); + } +} From e67c80a6a9d2ad76da661cd8e075dad6f16750c2 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Jan 2024 22:19:37 +0100 Subject: [PATCH 035/189] move ron to be specific to `app` --- Cargo.toml | 2 -- crates/app/Cargo.toml | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4e17091..3fff7c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,6 @@ resolver = "2" [workspace.dependencies] clap = { version = "4", features = [ "derive" ] } serde = { version = "1.0", features = [ "derive" ] } -ron = "0.8" -serde_json = "1.0" [lints.rust] unsafe_code = "deny" diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 0325fc1..a0043ee 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" [dependencies] clap = { workspace = true, features = [ "derive", "env" ] } serde = { workspace = true, features = [ "derive" ] } -ron = { workspace = true } -serde_json = { workspace = true } +ron = "0.8" +serde_json = "1.0" ariadne = "0.4" time = { version = "0.3", features = [ "local-offset" ] } dirs = "5" From 6ccfaedb13a3c8ce412e8d40d542f93290725403 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Jan 2024 22:21:49 +0100 Subject: [PATCH 036/189] fix cursed workspace member formatting done by cargo --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3fff7c3..bc41d16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] -members = [ "crates/app", +members = [ + "crates/app", "crates/executor", "crates/pl-cli", "crates/rpl" From ea2e5d6075e6d48d15b204c7a666126dcbc069de Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 15 Jan 2024 09:03:55 +0100 Subject: [PATCH 037/189] app: unify config handling stuff a bit --- crates/app/src/config.rs | 80 ++++++---------------------- crates/app/src/{ => config}/cli.rs | 0 crates/app/src/config/config_file.rs | 75 ++++++++++++++++++++++++++ crates/app/src/main.rs | 11 ++-- crates/rpl/Cargo.toml | 2 +- 5 files changed, 94 insertions(+), 74 deletions(-) rename crates/app/src/{ => config}/cli.rs (100%) create mode 100644 crates/app/src/config/config_file.rs diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index 86f6763..c19b94a 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -1,74 +1,24 @@ -use std::{ - fs, - path::{Path, PathBuf}, - process, -}; +use clap::Parser; -use serde::{Deserialize, Serialize}; +use self::{cli::Args, config_file::Configs}; -use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; +mod cli; +mod config_file; -#[derive(Debug, Serialize, Deserialize)] -pub struct Configs { - #[serde(default = "default_example_value")] - pub example_value: i32, - #[serde(default = "default_no_startup_msg")] - pub no_startup_message: bool, +/// this struct may hold all configuration +pub struct Config { + pub startup_msg: bool, } -/// what the fuck serde why do i need this -fn default_example_value() -> i32 { - 43 -} -fn default_no_startup_msg() -> bool { - false -} +impl Config { + pub fn read() -> Self { + let args = Args::parse(); + let cfg = Configs::read(args.config_file); -impl Configs { - pub fn read(custom_path: Option) -> Self { - use owo_colors::OwoColorize; - let p = match custom_path { - Some(p) => p, - None => { - let config_path = dirs::config_dir().expect("config dir should exist"); - - let ron_path = config_path.with_file_name("config.ron"); - let json_path = config_path.with_file_name("config.json"); - - if Path::new(&ron_path).exists() { - ron_path - } else if Path::new(&json_path).exists() { - json_path - } else { - eprintln!("{}: couldn't find config file", "Fatal error".red()); - process::exit(1) - } - } - }; - - match p.extension().map(|v| v.to_str().unwrap()) { - Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), - Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), - None | Some(_) => { - eprintln!( - "{}: couldn't determine config file type", - "Fatal error".red() - ); - process::exit(1) - } - } - } - pub fn read_json(config_text: &str) -> Configs { - match serde_json::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_json_err(config_text, e), - } - } - - pub fn read_ron(config_text: &str) -> Configs { - match ron::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_ron_err(config_text, e), + Self { + // this is negated because to an outward api, the negative is more intuitive, + // while in the source the other way around is more intuitive + startup_msg: !(args.no_startup_message || cfg.no_startup_message), } } } diff --git a/crates/app/src/cli.rs b/crates/app/src/config/cli.rs similarity index 100% rename from crates/app/src/cli.rs rename to crates/app/src/config/cli.rs diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs new file mode 100644 index 0000000..fc96675 --- /dev/null +++ b/crates/app/src/config/config_file.rs @@ -0,0 +1,75 @@ +use std::{ + fs, + path::{Path, PathBuf}, + process, +}; + +use serde::{Deserialize, Serialize}; + +use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Configs { + #[serde(default = "default_example_value")] + pub example_value: i32, + #[serde(default = "default_no_startup_msg")] + pub no_startup_message: bool, +} + +/// what the fuck serde why do i need this +pub(crate) fn default_example_value() -> i32 { + 43 +} + +pub(crate) fn default_no_startup_msg() -> bool { + false +} + +impl Configs { + pub fn read(custom_path: Option) -> Self { + use owo_colors::OwoColorize; + let p = match custom_path { + Some(p) => p, + None => { + let config_path = dirs::config_dir().expect("config dir should exist"); + + let ron_path = config_path.with_file_name("config.ron"); + let json_path = config_path.with_file_name("config.json"); + + if Path::new(&ron_path).exists() { + ron_path + } else if Path::new(&json_path).exists() { + json_path + } else { + eprintln!("{}: couldn't find config file", "Fatal error".red()); + process::exit(1) + } + } + }; + + match p.extension().map(|v| v.to_str().unwrap()) { + Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), + Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), + None | Some(_) => { + eprintln!( + "{}: couldn't determine config file type", + "Fatal error".red() + ); + process::exit(1) + } + } + } + pub fn read_json(config_text: &str) -> Configs { + match serde_json::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_json_err(config_text, e), + } + } + + pub fn read_ron(config_text: &str) -> Configs { + match ron::from_str(config_text) { + Ok(c) => c, + Err(e) => report_serde_ron_err(config_text, e), + } + } +} diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 491e8b4..deab5b4 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,19 +1,14 @@ -use clap::Parser; -use cli::Args; +use config::Config; use welcome_msg::print_startup_msg; -use crate::config::Configs; - -mod cli; mod config; mod error_reporting; mod welcome_msg; fn main() { - let args = Args::parse(); - let cfg = Configs::read(args.config_file); + let cfg = Config::read(); - if !(args.no_startup_message || cfg.no_startup_message) { + if cfg.startup_msg { print_startup_msg(); } } diff --git a/crates/rpl/Cargo.toml b/crates/rpl/Cargo.toml index d125c78..b40a46e 100644 --- a/crates/rpl/Cargo.toml +++ b/crates/rpl/Cargo.toml @@ -7,4 +7,4 @@ edition = "2021" [dependencies] serde = { workspace = true, features = [ "derive" ] } -ron = { workspace = true } +ron = "0.8" From 7c9dca0ae21a0754ffb9e9899e4dda53d97dd776 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 15 Jan 2024 10:43:35 +0100 Subject: [PATCH 038/189] app: improve config loading and merging --- crates/app/src/config.rs | 49 +++++++++++++++++-- crates/app/src/config/cli.rs | 2 +- crates/app/src/config/config_file.rs | 71 ++++++++++------------------ crates/app/src/main.rs | 5 +- 4 files changed, 73 insertions(+), 54 deletions(-) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index c19b94a..a0196fe 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -1,6 +1,10 @@ use clap::Parser; -use self::{cli::Args, config_file::Configs}; +use self::{ + cli::Args, + config_file::{find_config_file, Configs}, + error::ConfigError, +}; mod cli; mod config_file; @@ -11,14 +15,49 @@ pub struct Config { } impl Config { - pub fn read() -> Self { + pub fn read() -> Result { let args = Args::parse(); - let cfg = Configs::read(args.config_file); + let config_path = if let Some(config_path) = args.config_path { + config_path + } else { + find_config_file()? + }; + let file_config = Configs::read(config_path)?; - Self { + Ok(Self { // this is negated because to an outward api, the negative is more intuitive, // while in the source the other way around is more intuitive - startup_msg: !(args.no_startup_message || cfg.no_startup_message), + startup_msg: !(args.no_startup_message || file_config.no_startup_message), + }) + } +} + +pub mod error { + #[derive(Debug)] + pub enum ConfigError { + NoConfigDir, + NoConfigFileFound, + IoError(std::io::Error), + UnknownExtension(Option), + SerdeJsonError(serde_json::Error), + SerdeRonError(ron::error::SpannedError), + } + + impl From for ConfigError { + fn from(value: std::io::Error) -> Self { + Self::IoError(value) + } + } + + impl From for ConfigError { + fn from(value: serde_json::Error) -> Self { + Self::SerdeJsonError(value) + } + } + + impl From for ConfigError { + fn from(value: ron::error::SpannedError) -> Self { + Self::SerdeRonError(value) } } } diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index 30754c5..23f8ef1 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -6,7 +6,7 @@ use clap::Parser; pub(crate) struct Args { /// Read this config file. #[arg(short, long)] - pub config_file: Option, + pub config_path: Option, #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] pub no_startup_message: bool, } diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index fc96675..d454223 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -1,12 +1,11 @@ use std::{ fs, path::{Path, PathBuf}, - process, }; use serde::{Deserialize, Serialize}; -use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; +use super::error::ConfigError; #[derive(Debug, Serialize, Deserialize)] pub struct Configs { @@ -17,59 +16,37 @@ pub struct Configs { } /// what the fuck serde why do i need this -pub(crate) fn default_example_value() -> i32 { +fn default_example_value() -> i32 { 43 } -pub(crate) fn default_no_startup_msg() -> bool { +fn default_no_startup_msg() -> bool { false } +pub(super) fn find_config_file() -> Result { + let Some(config_path) = dirs::config_dir() else { + return Err(ConfigError::NoConfigDir); + }; + + let ron_path = config_path.with_file_name("config.ron"); + let json_path = config_path.with_file_name("config.json"); + + if Path::new(&ron_path).exists() { + Ok(ron_path) + } else if Path::new(&json_path).exists() { + Ok(json_path) + } else { + Err(ConfigError::NoConfigFileFound) + } +} + impl Configs { - pub fn read(custom_path: Option) -> Self { - use owo_colors::OwoColorize; - let p = match custom_path { - Some(p) => p, - None => { - let config_path = dirs::config_dir().expect("config dir should exist"); - - let ron_path = config_path.with_file_name("config.ron"); - let json_path = config_path.with_file_name("config.json"); - - if Path::new(&ron_path).exists() { - ron_path - } else if Path::new(&json_path).exists() { - json_path - } else { - eprintln!("{}: couldn't find config file", "Fatal error".red()); - process::exit(1) - } - } - }; - + pub fn read(p: PathBuf) -> Result { match p.extension().map(|v| v.to_str().unwrap()) { - Some("ron") => Self::read_json(&fs::read_to_string(p).unwrap()), - Some("json") => Self::read_ron(&fs::read_to_string(p).unwrap()), - None | Some(_) => { - eprintln!( - "{}: couldn't determine config file type", - "Fatal error".red() - ); - process::exit(1) - } - } - } - pub fn read_json(config_text: &str) -> Configs { - match serde_json::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_json_err(config_text, e), - } - } - - pub fn read_ron(config_text: &str) -> Configs { - match ron::from_str(config_text) { - Ok(c) => c, - Err(e) => report_serde_ron_err(config_text, e), + Some("ron") => Ok(serde_json::from_str(&fs::read_to_string(p)?)?), + Some("json") => Ok(ron::from_str(&fs::read_to_string(p)?)?), + e => Err(ConfigError::UnknownExtension(e.map(|v| v.to_owned()))), } } } diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index deab5b4..dd7f3e4 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -2,11 +2,14 @@ use config::Config; use welcome_msg::print_startup_msg; mod config; + +#[allow(unused)] mod error_reporting; mod welcome_msg; fn main() { - let cfg = Config::read(); + // TODO: proper error handling + let cfg = Config::read().unwrap(); if cfg.startup_msg { print_startup_msg(); From 6006f92d9c9a16a729067820bbb315aba0a45060 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 19 Jan 2024 08:54:36 +0100 Subject: [PATCH 039/189] app: better? config error handling --- crates/app/src/config.rs | 39 +++++++++++++++++++++++++++++---------- crates/app/src/main.rs | 2 +- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index a0196fe..f68fa34 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -3,7 +3,6 @@ use clap::Parser; use self::{ cli::Args, config_file::{find_config_file, Configs}, - error::ConfigError, }; mod cli; @@ -15,20 +14,40 @@ pub struct Config { } impl Config { - pub fn read() -> Result { + pub fn read() -> Self { let args = Args::parse(); let config_path = if let Some(config_path) = args.config_path { - config_path + Ok(config_path) } else { - find_config_file()? + find_config_file() }; - let file_config = Configs::read(config_path)?; - Ok(Self { - // this is negated because to an outward api, the negative is more intuitive, - // while in the source the other way around is more intuitive - startup_msg: !(args.no_startup_message || file_config.no_startup_message), - }) + let file_config = if let Ok(config_path) = config_path { + let file_config = Configs::read(config_path); + + match file_config { + Ok(c) => Some(c), + Err(e) => { + eprintln!("Config error: {e:?}"); + eprintln!("Proceeding with defaults or cli args..."); + None + } + } + } else { + None + }; + + if let Some(file_config) = file_config { + Self { + // this is negated because to an outward api, the negative is more intuitive, + // while in the source the other way around is more intuitive + startup_msg: !(args.no_startup_message || file_config.no_startup_message), + } + } else { + Self { + startup_msg: !args.no_startup_message, + } + } } } diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index dd7f3e4..1347572 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -9,7 +9,7 @@ mod welcome_msg; fn main() { // TODO: proper error handling - let cfg = Config::read().unwrap(); + let cfg = Config::read(); if cfg.startup_msg { print_startup_msg(); From 0615ea653c27a9e15ed4cb0d40fd00ae3f36048a Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 19 Jan 2024 09:51:48 +0100 Subject: [PATCH 040/189] app(doc): well... write the docs --- crates/app/src/config.rs | 11 +++++++++++ crates/app/src/config/cli.rs | 3 +++ crates/app/src/config/config_file.rs | 7 ++----- crates/app/src/error_reporting.rs | 7 ++++++- crates/app/src/welcome_msg.rs | 3 +++ 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index f68fa34..9f2b15a 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -14,6 +14,7 @@ pub struct Config { } impl Config { + /// Get the configs from all possible places (args, file, env...) pub fn read() -> Self { let args = Args::parse(); let config_path = if let Some(config_path) = args.config_path { @@ -22,6 +23,7 @@ impl Config { find_config_file() }; + // try to read a maybe existing config file let file_config = if let Ok(config_path) = config_path { let file_config = Configs::read(config_path); @@ -52,13 +54,22 @@ impl Config { } pub mod error { + /// Errors that can occur when reading configs #[derive(Debug)] pub enum ConfigError { + /// The config dir doesn't exist NoConfigDir, + /// We didn't find a config file in the config dir NoConfigFileFound, + /// An io error happened while reading/opening it! IoError(std::io::Error), + /// The given extension (via an argument) isn't known. + /// + /// Occurs if the extension is neither `.json` nor `.ron` (including if there is no extension, in which case this will be `None`). UnknownExtension(Option), + /// Wrapper around an `Error` from `serde_json` SerdeJsonError(serde_json::Error), + /// Wrapper around a `SpannedError` from `ron` SerdeRonError(ron::error::SpannedError), } diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index 23f8ef1..92026a2 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -7,6 +7,9 @@ pub(crate) struct Args { /// Read this config file. #[arg(short, long)] pub config_path: Option, + /// Turn off the startup message. + /// + /// The startup message is not constant and depends on the time. #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] pub no_startup_message: bool, } diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index d454223..a0c4db1 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -11,7 +11,7 @@ use super::error::ConfigError; pub struct Configs { #[serde(default = "default_example_value")] pub example_value: i32, - #[serde(default = "default_no_startup_msg")] + #[serde(default)] pub no_startup_message: bool, } @@ -20,10 +20,7 @@ fn default_example_value() -> i32 { 43 } -fn default_no_startup_msg() -> bool { - false -} - +/// Find the location of a config file and check if there is, in fact, a file pub(super) fn find_config_file() -> Result { let Some(config_path) = dirs::config_dir() else { return Err(ConfigError::NoConfigDir); diff --git a/crates/app/src/error_reporting.rs b/crates/app/src/error_reporting.rs index f71e10d..33ffff6 100644 --- a/crates/app/src/error_reporting.rs +++ b/crates/app/src/error_reporting.rs @@ -2,16 +2,19 @@ use std::process; use ron::error::Position; +/// Report an `Error` from the `serde_json` crate pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { report_serde_err(src, err.line(), err.column(), err.to_string()) } +/// Report a `SpannedError` from the `ron` crate pub fn report_serde_ron_err(src: &str, err: ron::error::SpannedError) -> ! { let Position { line, col } = err.position; report_serde_err(src, line, col, err.to_string()) } -pub fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { +/// Basic function for reporting serde type of errors +fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { use ariadne::{Label, Report, Source}; let offset = try_reconstruct_loc(src, line, col); @@ -24,6 +27,8 @@ pub fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { .unwrap(); process::exit(1); } + +/// Reconstruct a byte offset from the line + column numbers typical from serde crates fn try_reconstruct_loc(src: &str, line_nr: usize, col_nr: usize) -> usize { let (line_nr, col_nr) = (line_nr - 1, col_nr - 1); diff --git a/crates/app/src/welcome_msg.rs b/crates/app/src/welcome_msg.rs index c03c543..a3e15a3 100644 --- a/crates/app/src/welcome_msg.rs +++ b/crates/app/src/welcome_msg.rs @@ -1,11 +1,14 @@ use time::{Month, OffsetDateTime}; +/// Print the startup message which changes depending on system time. pub fn print_startup_msg() { // now or fallback to utc let now = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); if now.month() == Month::June { + // pride startup message println!("Hello, thanks for using iOwO and happy pride month!"); + // TODO: proper link with explaination println!("Why pride month is important in {}", now.year()); } else { println!("Hello, thanks for using iOwO! :3"); From 746c81ab60afb168060cd8247734d19f91ce20ca Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 19 Jan 2024 18:50:51 +0100 Subject: [PATCH 041/189] app(cli): apply review --- crates/app/src/config/cli.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index 92026a2..bdf769e 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use clap::Parser; +use clap::{builder::BoolishValueParser, ArgAction, Parser}; #[derive(Parser)] pub(crate) struct Args { @@ -10,6 +10,6 @@ pub(crate) struct Args { /// Turn off the startup message. /// /// The startup message is not constant and depends on the time. - #[arg(long, env = "NO_STARTUP_MESSAGE", default_value = "false")] + #[arg(long, env = "NO_STARTUP_MESSAGE", action = ArgAction::SetTrue, value_parser = BoolishValueParser::new())] pub no_startup_message: bool, } From 48458fd1c966573023c4b1e966c2a916d10d157f Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 20 Jan 2024 20:07:55 +0100 Subject: [PATCH 042/189] remove old cli --- Cargo.toml | 1 - crates/pl-cli/Cargo.toml | 11 ----------- crates/pl-cli/src/main.rs | 19 ------------------- 3 files changed, 31 deletions(-) delete mode 100644 crates/pl-cli/Cargo.toml delete mode 100644 crates/pl-cli/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index bc41d16..1fc1618 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,6 @@ members = [ "crates/app", "crates/executor", - "crates/pl-cli", "crates/rpl" ] resolver = "2" diff --git a/crates/pl-cli/Cargo.toml b/crates/pl-cli/Cargo.toml deleted file mode 100644 index e6f8cc8..0000000 --- a/crates/pl-cli/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "pl-cli" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -clap = { workspace = true, features = [ "derive" ] } -rpl = { path = "../rpl" } -executor = { path = "../executor" } diff --git a/crates/pl-cli/src/main.rs b/crates/pl-cli/src/main.rs deleted file mode 100644 index 9e84d33..0000000 --- a/crates/pl-cli/src/main.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::{fs, path::PathBuf}; - -use clap::Parser; -use executor::{execute_all, Executors}; - -#[derive(Parser, Debug)] -pub struct Args { - file: PathBuf, - primary_executor: Executors, -} - -fn main() { - let args = dbg!(Args::parse()); - - let f = fs::read_to_string(args.file).unwrap(); - let pl = rpl::from_ron(&f); - - execute_all(pl.0); -} From 24ebca3e8dfdb4d043598e0f98feebf705009964 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 00:36:58 +0100 Subject: [PATCH 043/189] repo: make build possible --- Cargo.toml | 4 ++-- flake.nix | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1fc1618..2f5ec17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,11 +10,11 @@ resolver = "2" clap = { version = "4", features = [ "derive" ] } serde = { version = "1.0", features = [ "derive" ] } -[lints.rust] +[workspace.lints.rust] unsafe_code = "deny" variant_size_differences = "warn" -[lints.clippy] +[workspace.lints.clippy] branches_sharing_code = "warn" clone_on_ref_ptr = "warn" cognitive_complexity = "warn" diff --git a/flake.nix b/flake.nix index ab394bf..ffbb283 100644 --- a/flake.nix +++ b/flake.nix @@ -36,7 +36,10 @@ rustfmt.enable = true; }; - packages = with pkgs; [just nushell typst]; + packages = with pkgs; [ + just nushell typst + mold + ]; }) ]; }; From 816602fb2efac3ea3953c684d94e3b865bad5843 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 01:36:47 +0100 Subject: [PATCH 044/189] fix: take care of clippy warnings and add test image --- crates/executor/src/debug/instructions/mod.rs | 29 ++++++++++-------- crates/executor/src/debug/mod.rs | 20 ++++++------ crates/executor/src/lib.rs | 6 ++-- crates/executor/src/value/mod.rs | 2 +- crates/rpl/src/lib.rs | 12 +++----- testfiles/invert.rpl | 4 +-- testfiles/juan.jpg | Bin 0 -> 91131 bytes 7 files changed, 37 insertions(+), 36 deletions(-) create mode 100644 testfiles/juan.jpg diff --git a/crates/executor/src/debug/instructions/mod.rs b/crates/executor/src/debug/instructions/mod.rs index 0c4b611..0bbbfaa 100644 --- a/crates/executor/src/debug/instructions/mod.rs +++ b/crates/executor/src/debug/instructions/mod.rs @@ -2,8 +2,9 @@ pub mod read { use image::{io::Reader as ImageReader, DynamicImage}; use rpl::instructions::read::{Read, SourceType}; - pub fn read(Read { source, format }: Read) -> DynamicImage { - let mut img = ImageReader::open(match source { + pub fn read(Read { source, format: _ }: Read) -> DynamicImage { + // TODO: actual error handling + let img = ImageReader::open(match source { SourceType::File(path) => path, }) .expect("something went wrong :((("); @@ -13,19 +14,21 @@ pub mod read { } pub mod write { - use image::{io::Reader as ImageReader, DynamicImage, ImageFormat}; + use image::{DynamicImage, ImageFormat}; use rpl::instructions::write::{TargetFormat, TargetType, Write}; - pub fn write(Write { target, format }: Write, input_data: DynamicImage) { - input_data.save_with_format( - match target { - TargetType::File(path) => path, - }, - match format { - TargetFormat::Jpeg => ImageFormat::Jpeg, - TargetFormat::Png => ImageFormat::Png, - }, - ); + pub fn write(Write { target, format }: Write, input_data: &DynamicImage) { + input_data + .save_with_format( + match target { + TargetType::File(path) => path, + }, + match format { + TargetFormat::Jpeg => ImageFormat::Jpeg, + TargetFormat::Png => ImageFormat::Png, + }, + ) + .expect("couldn't save file — come back later and handle me properly please uwu"); } } diff --git a/crates/executor/src/debug/mod.rs b/crates/executor/src/debug/mod.rs index d56f546..8cde85b 100644 --- a/crates/executor/src/debug/mod.rs +++ b/crates/executor/src/debug/mod.rs @@ -1,21 +1,21 @@ use rpl::instructions::{FilterInstruction, Instruction}; -use crate::{value::DynamicValue, Executor}; +use crate::value::Dynamic; mod instructions; -pub struct DebugExecutor; +pub struct Executor; -impl Executor for DebugExecutor { - fn execute(instruction: Instruction, input: Option) -> Option { +impl crate::Executor for Executor { + fn execute(instruction: Instruction, input: Option) -> Option { match instruction { - Instruction::Read(read_instruction) => Some(DynamicValue::Image( - instructions::read::read(read_instruction), - )), + Instruction::Read(read_instruction) => { + Some(Dynamic::Image(instructions::read::read(read_instruction))) + } Instruction::Write(write_instruction) => { instructions::write::write( write_instruction, match input { - Some(DynamicValue::Image(img)) => img, + Some(Dynamic::Image(ref img)) => img, _ => panic!("awawwawwa"), }, ); @@ -25,9 +25,9 @@ impl Executor for DebugExecutor { Instruction::Blend(_) => todo!(), Instruction::Noise(_) => todo!(), Instruction::Filter(filter_instruction) => match filter_instruction { - FilterInstruction::Invert => Some(DynamicValue::Image( + FilterInstruction::Invert => Some(Dynamic::Image( instructions::filters::invert::invert(match input { - Some(DynamicValue::Image(img)) => img, + Some(Dynamic::Image(img)) => img, _ => panic!("invalid value type for invert"), }), )), diff --git a/crates/executor/src/lib.rs b/crates/executor/src/lib.rs index fb55029..9e4da44 100644 --- a/crates/executor/src/lib.rs +++ b/crates/executor/src/lib.rs @@ -1,5 +1,5 @@ use rpl::instructions::Instruction; -use value::DynamicValue; +use value::Dynamic; mod debug; mod value; @@ -17,14 +17,14 @@ pub enum Executors { } trait Executor { - fn execute(instruction: Instruction, input: Option) -> Option; + fn execute(instruction: Instruction, input: Option) -> Option; } pub fn execute_all(instructions: Vec) { let mut tmp = None; for instruction in instructions { - tmp = debug::DebugExecutor::execute(instruction, tmp); + tmp = debug::Executor::execute(instruction, tmp); } } diff --git a/crates/executor/src/value/mod.rs b/crates/executor/src/value/mod.rs index daf0dd2..f3595d0 100644 --- a/crates/executor/src/value/mod.rs +++ b/crates/executor/src/value/mod.rs @@ -1,5 +1,5 @@ use image::DynamicImage; -pub enum DynamicValue { +pub enum Dynamic { Image(DynamicImage), } diff --git a/crates/rpl/src/lib.rs b/crates/rpl/src/lib.rs index dbecd0a..91180c1 100644 --- a/crates/rpl/src/lib.rs +++ b/crates/rpl/src/lib.rs @@ -1,16 +1,14 @@ use instructions::Instruction; use serde::{Deserialize, Serialize}; -use crate::instructions::{ - read::{SourceFormat, SourceType}, - write::{TargetFormat, TargetType}, - MathInstruction, -}; - pub mod instructions; +/// # Panics +/// +/// Panics if deserialization fails. lol. +#[must_use] pub fn from_ron(raw: &str) -> Rpl { - ron::from_str(raw).unwrap() + ron::from_str(raw).expect("come back later and handle me correctly") } #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] diff --git a/testfiles/invert.rpl b/testfiles/invert.rpl index d17fe1a..5f235a9 100644 --- a/testfiles/invert.rpl +++ b/testfiles/invert.rpl @@ -1,12 +1,12 @@ ( [ Read(( - source: File("/home/jade/example/file.png"), + source: File("testfiles/juan.jpg"), format: Png )), Filter(Invert), Write(( - target: File("/home/jade/example/inverted.jpg"), + target: File("testfiles/inverted.jpg"), format: Jpeg )) ] diff --git a/testfiles/juan.jpg b/testfiles/juan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c4399f2464af28375c542bacb36e482cc613c90 GIT binary patch literal 91131 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

w43$whsb86}Y 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

HPm?&h4F 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 literal 0 HcmV?d00001 From f445a03fb26f6633780c7aa792eaeb68d47242f0 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 10:39:03 +0100 Subject: [PATCH 045/189] docs: microoptimize graph a bit --- docs/design/util/graphics.typ | 5 ++++- flake.nix | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/design/util/graphics.typ b/docs/design/util/graphics.typ index f097b51..03617a1 100644 --- a/docs/design/util/graphics.typ +++ b/docs/design/util/graphics.typ @@ -219,8 +219,11 @@ ) } +// i wonder if layouting could be automatized +// if the graph is guaranteed to be acyclic, +// then we could just lay them out in "columns" #let graph-example = canvas({ - let x = 3 + let x = 2.25 let y = -3 node((-x, -0.75 * y), ty: "const", body: "\"base.png\"", name: "base") node((x, -0.75 * y), ty: "const", body: "\"stencil.png\"", name: "stencil") diff --git a/flake.nix b/flake.nix index ffbb283..d8e5186 100644 --- a/flake.nix +++ b/flake.nix @@ -37,7 +37,8 @@ }; packages = with pkgs; [ - just nushell typst + just nushell + typst typst-lsp mold ]; }) From 8f3c4263591a2e1871404b589d3c3da6ea9a05a7 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 11:39:59 +0100 Subject: [PATCH 046/189] style: propagate clippy lints throughout workspace --- Cargo.toml | 4 ++++ crates/executor/Cargo.toml | 3 +++ crates/executor/src/debug/instructions/mod.rs | 2 +- crates/rpl/Cargo.toml | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2f5ec17..c6acf53 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,10 @@ resolver = "2" clap = { version = "4", features = [ "derive" ] } serde = { version = "1.0", features = [ "derive" ] } +# to enable all the lints below, this must be present in a workspace member's Cargo.toml: +# [lints] +# workspace = true + [workspace.lints.rust] unsafe_code = "deny" variant_size_differences = "warn" diff --git a/crates/executor/Cargo.toml b/crates/executor/Cargo.toml index fc01c27..49d9685 100644 --- a/crates/executor/Cargo.toml +++ b/crates/executor/Cargo.toml @@ -9,3 +9,6 @@ edition = "2021" clap = { workspace = true, features = [ "derive" ] } image = "0.24" rpl = { path = "../rpl" } + +[lints] +workspace = true diff --git a/crates/executor/src/debug/instructions/mod.rs b/crates/executor/src/debug/instructions/mod.rs index 0bbbfaa..7fa5531 100644 --- a/crates/executor/src/debug/instructions/mod.rs +++ b/crates/executor/src/debug/instructions/mod.rs @@ -2,7 +2,7 @@ pub mod read { use image::{io::Reader as ImageReader, DynamicImage}; use rpl::instructions::read::{Read, SourceType}; - pub fn read(Read { source, format: _ }: Read) -> DynamicImage { + pub fn read(Read { source, .. }: Read) -> DynamicImage { // TODO: actual error handling let img = ImageReader::open(match source { SourceType::File(path) => path, diff --git a/crates/rpl/Cargo.toml b/crates/rpl/Cargo.toml index b40a46e..7cfd2ce 100644 --- a/crates/rpl/Cargo.toml +++ b/crates/rpl/Cargo.toml @@ -8,3 +8,6 @@ edition = "2021" [dependencies] serde = { workspace = true, features = [ "derive" ] } ron = "0.8" + +[lints] +workspace = true From 5bf277cf14af26631e2c463307d56068aec38095 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 12:03:43 +0100 Subject: [PATCH 047/189] test: fix running tests --- crates/rpl/src/lib.rs | 46 ++++++++++++++++++++++++++----------------- flake.nix | 1 + justfile | 6 ++++++ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/crates/rpl/src/lib.rs b/crates/rpl/src/lib.rs index 91180c1..6290fb2 100644 --- a/crates/rpl/src/lib.rs +++ b/crates/rpl/src/lib.rs @@ -14,23 +14,33 @@ pub fn from_ron(raw: &str) -> Rpl { #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] pub struct Rpl(pub Vec); -#[test] -fn test_simple_deserialize() { - const TEST_DATA: &str = - "([Read( (source: File(\"~/example/file.png\"), format: Png) ),Math(Add),Write(( target: File(\"~/example/out.jpg\"), format: Jpeg))])"; +#[cfg(test)] +mod tests { + use super::*; + use crate::instructions::{ + read::{SourceFormat, SourceType}, + write::{TargetFormat, TargetType}, + MathInstruction, + }; - assert_eq!( - from_ron(TEST_DATA), - Rpl(vec![ - Instruction::Read(instructions::read::Read { - source: SourceType::File("~/example/file.png".into()), - format: SourceFormat::Png - }), - Instruction::Math(MathInstruction::Add), - Instruction::Write(instructions::write::Write { - target: TargetType::File("~/example/out.jpg".into()), - format: TargetFormat::Jpeg - }) - ]) - ); + #[test] + fn test_simple_deserialize() { + const TEST_DATA: &str = + "([Read( (source: File(\"~/example/file.png\"), format: Png) ),Math(Add),Write(( target: File(\"~/example/out.jpg\"), format: Jpeg))])"; + + assert_eq!( + from_ron(TEST_DATA), + Rpl(vec![ + Instruction::Read(instructions::read::Read { + source: SourceType::File("~/example/file.png".into()), + format: SourceFormat::Png + }), + Instruction::Math(MathInstruction::Add), + Instruction::Write(instructions::write::Write { + target: TargetType::File("~/example/out.jpg".into()), + format: TargetFormat::Jpeg + }) + ]) + ); + } } diff --git a/flake.nix b/flake.nix index d8e5186..aa617a3 100644 --- a/flake.nix +++ b/flake.nix @@ -40,6 +40,7 @@ just nushell typst typst-lsp mold + cargo-nextest ]; }) ]; diff --git a/justfile b/justfile index 3715e45..396f6eb 100644 --- a/justfile +++ b/justfile @@ -1,3 +1,5 @@ +all: test docs + # Compile all documentation as in proposals and design documents, placing them under `docs/compiled`. docs: #!/usr/bin/env nu @@ -9,3 +11,7 @@ docs: ) mv $pdf docs/compiled } | ignore + +test: + #!/usr/bin/env nu + cargo nextest run From 77d1236720fd6b1bc191e2328ab66a7035db4305 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 12:27:38 +0100 Subject: [PATCH 048/189] test: prettify TEST_DATA over multiple lines --- crates/rpl/src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/rpl/src/lib.rs b/crates/rpl/src/lib.rs index 6290fb2..0e5011e 100644 --- a/crates/rpl/src/lib.rs +++ b/crates/rpl/src/lib.rs @@ -25,8 +25,13 @@ mod tests { #[test] fn test_simple_deserialize() { - const TEST_DATA: &str = - "([Read( (source: File(\"~/example/file.png\"), format: Png) ),Math(Add),Write(( target: File(\"~/example/out.jpg\"), format: Jpeg))])"; + const TEST_DATA: &str = concat!( + "([", + "Read( (source: File(\"~/example/file.png\"), format: Png) ),", + "Math(Add),", + "Write(( target: File(\"~/example/out.jpg\"), format: Jpeg)),", + "])", + ); assert_eq!( from_ron(TEST_DATA), From d1001ad90d08061356f110d9137acdf72ae6edd7 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 13:55:51 +0100 Subject: [PATCH 049/189] docs: retab from tabs to 2 spaces --- docs/design/util/graphics.typ | 80 +++++++++++++++++------------------ docs/template.typ | 68 ++++++++++++++--------------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/docs/design/util/graphics.typ b/docs/design/util/graphics.typ index 03617a1..c9b9fef 100644 --- a/docs/design/util/graphics.typ +++ b/docs/design/util/graphics.typ @@ -7,69 +7,69 @@ // - `group` can be used in either of ^, but not standalone #let graphic(what) = box({ - cetz.canvas({ - // any preamble-ish stuff can go here - set-style( - mark: (angle: 90deg), + cetz.canvas({ + // any preamble-ish stuff can go here + set-style( + mark: (angle: 90deg), stroke: (cap: "round", join: "round"), - ) + ) - what - }) + what + }) }) #let canvas(what) = { - align(center, graphic(what)) + align(center, graphic(what)) } // smaller stuff #let arrow(length: 0.4cm, lift: 3pt, stroke: 1pt) = graphic({ - line((0, lift), (rel: (length, 0)), mark: (end: ">", stroke: stroke)) + line((0, lift), (rel: (length, 0)), mark: (end: ">", stroke: stroke)) - // hack for the bounding box bottom - // so that `lift` even has any effect - line((0, 0), (0, 0), stroke: none) + // hack for the bounding box bottom + // so that `lift` even has any effect + line((0, 0), (0, 0), stroke: none) }) // larger stuff #let sequence( - distance: 3cm, - arrow-spacing: 0.15cm, - // cetz will support rounded rects in 0.2.0 - style: (frame: "rect", padding: 0.1cm), - ..labels, + distance: 3cm, + arrow-spacing: 0.15cm, + // cetz will support rounded rects in 0.2.0 + style: (frame: "rect", padding: 0.1cm), + ..labels, ) = group({ - let labels = labels.pos() + let labels = labels.pos() - // draw each label itself - for (i, label) in labels.enumerate() { - if i != 0 { - set-origin((distance, 0)) - } - content((0, 0), name: "label-" + str(i), label, ..style) - } + // draw each label itself + for (i, label) in labels.enumerate() { + if i != 0 { + set-origin((distance, 0)) + } + content((0, 0), name: "label-" + str(i), label, ..style) + } - // then draw an arrow from each to each - // since an arrow is between two, the last one can't be connected with the "next-to-last" one - // so we leave it out - for i in range(labels.len() - 1) { - line( - (rel: (arrow-spacing, 0), to: "label-" + str(i) + ".right"), - (rel: (-arrow-spacing, 0), to: "label-" + str(i + 1) + ".left"), - mark: (end: ">"), - ) - } + // then draw an arrow from each to each + // since an arrow is between two, the last one can't be connected with the "next-to-last" one + // so we leave it out + for i in range(labels.len() - 1) { + line( + (rel: (arrow-spacing, 0), to: "label-" + str(i) + ".right"), + (rel: (-arrow-spacing, 0), to: "label-" + str(i + 1) + ".left"), + mark: (end: ">"), + ) + } }) #let stages-overview = canvas({ - sequence( - [Source], - [Graph IR], - [Runtime], - ) + sequence( + [Source], + [Graph IR], + [Runtime], + ) }) // A few commands to help demonstration in the docs. diff --git a/docs/template.typ b/docs/template.typ index 9f48dba..a7ce038 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -1,11 +1,11 @@ // would also be interesting to try out IBM Plex Mono/Sans sometime #let atk = "Atkinson Hyperlegible" #let fonts = ( - main: (font: atk, size: 12pt), + main: (font: atk, size: 12pt), - title: (font: atk, size: 20pt), - subtitle: (font: atk, size: 10pt), - heading: (font: "Montserrat", weight: "regular"), + title: (font: atk, size: 20pt), + subtitle: (font: atk, size: 10pt), + heading: (font: "Montserrat", weight: "regular"), ) #let expand(it) = { @@ -54,28 +54,28 @@ #let terms = regex("\\b(" + terms.map(expand).join("|") + ")\\b") #let conf( - title: none, - subtitle: none, - doc, + title: none, + subtitle: none, + doc, ) = { - set page( - numbering: "1 / 1", - margin: 3.25cm, - header: locate(loc => { - datetime.today().display() + set page( + numbering: "1 / 1", + margin: 3.25cm, + header: locate(loc => { + datetime.today().display() - if counter(page).at(loc).first() > 1 { - // on all pages other than the first, the title is useful to have at hand - h(1fr) - title - } - }), - ) + if counter(page).at(loc).first() > 1 { + // on all pages other than the first, the title is useful to have at hand + h(1fr) + title + } + }), + ) set par(justify: true) - set text(..fonts.main) - set heading(numbering: "A.1") + set text(..fonts.main) + set heading(numbering: "A.1") - show heading: it => text(..fonts.heading, it) + show heading: it => text(..fonts.heading, it) // color links show link: text.with(fill: blue) // prettify codeblocks @@ -121,17 +121,17 @@ raw(it.text, lang: "haskell", block: true) } - // document title - if title != none { - align( - right, - text(..fonts.title, title) - + v(-12pt) - + text(..fonts.subtitle, subtitle) - ) + // document title + if title != none { + align( + right, + text(..fonts.title, title) + + v(-12pt) + + text(..fonts.subtitle, subtitle) + ) - v(0.25cm) - } + v(0.25cm) + } // outline and other prelude info outline( @@ -147,6 +147,6 @@ ), ) - // content itself - doc + // content itself + doc } From c0dd533d8108fe96ef654b80ec120d5dfd98a347 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 14:01:29 +0100 Subject: [PATCH 050/189] docs(template): make outline rendering configurable --- docs/design/util/graphics.typ | 2 +- docs/template.typ | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/design/util/graphics.typ b/docs/design/util/graphics.typ index c9b9fef..909f436 100644 --- a/docs/design/util/graphics.typ +++ b/docs/design/util/graphics.typ @@ -248,7 +248,7 @@ // literally just for standalone display of the graphics alone #import "../../template.typ": conf -#show: conf +#show: conf.with(render-outline: false) #set page(width: auto, height: auto) #graph-example diff --git a/docs/template.typ b/docs/template.typ index a7ce038..a624cc7 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -56,6 +56,7 @@ #let conf( title: none, subtitle: none, + render-outline: true, doc, ) = { set page( @@ -134,18 +135,20 @@ } // outline and other prelude info - outline( - indent: auto, - fill: line( - length: 100%, - stroke: ( - cap: "round", - join: "round", - thickness: 0.5pt, - paint: luma(75%), + if render-outline { + outline( + indent: auto, + fill: line( + length: 100%, + stroke: ( + cap: "round", + join: "round", + thickness: 0.5pt, + paint: luma(75%), + ), ), - ), - ) + ) + } // content itself doc From ccbccfb11b9d5b552bbc7e2d3d0890f80d9d91f7 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 11 Jan 2024 14:10:44 +0100 Subject: [PATCH 051/189] style: drop Instruction suffix from instructions --- crates/executor/src/debug/mod.rs | 10 +++++----- crates/rpl/src/instructions/mod.rs | 16 ++++++++-------- crates/rpl/src/lib.rs | 4 ++-- testfiles/{bare.rpl => bare.ron} | 0 testfiles/{invert.rpl => invert.ron} | 0 5 files changed, 15 insertions(+), 15 deletions(-) rename testfiles/{bare.rpl => bare.ron} (100%) rename testfiles/{invert.rpl => invert.ron} (100%) diff --git a/crates/executor/src/debug/mod.rs b/crates/executor/src/debug/mod.rs index 8cde85b..b7524d3 100644 --- a/crates/executor/src/debug/mod.rs +++ b/crates/executor/src/debug/mod.rs @@ -1,4 +1,4 @@ -use rpl::instructions::{FilterInstruction, Instruction}; +use rpl::instructions::{Filter, Instruction}; use crate::value::Dynamic; mod instructions; @@ -25,12 +25,12 @@ impl crate::Executor for Executor { Instruction::Blend(_) => todo!(), Instruction::Noise(_) => todo!(), Instruction::Filter(filter_instruction) => match filter_instruction { - FilterInstruction::Invert => Some(Dynamic::Image( - instructions::filters::invert::invert(match input { + Filter::Invert => Some(Dynamic::Image(instructions::filters::invert::invert( + match input { Some(Dynamic::Image(img)) => img, _ => panic!("invalid value type for invert"), - }), - )), + }, + ))), }, } } diff --git a/crates/rpl/src/instructions/mod.rs b/crates/rpl/src/instructions/mod.rs index 9fb8a56..76ecc22 100644 --- a/crates/rpl/src/instructions/mod.rs +++ b/crates/rpl/src/instructions/mod.rs @@ -7,14 +7,14 @@ pub mod write; pub enum Instruction { Read(read::Read), Write(write::Write), - Math(MathInstruction), - Blend(BlendInstruction), - Noise(NoiseInstruction), - Filter(FilterInstruction), + Math(Math), + Blend(Blend), + Noise(Noise), + Filter(Filter), } #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum MathInstruction { +pub enum Math { Add, Subtract, Multiply, @@ -22,7 +22,7 @@ pub enum MathInstruction { } #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum BlendInstruction { +pub enum Blend { Normal, Multiply, Additive, @@ -35,13 +35,13 @@ pub enum BlendInstruction { } #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum NoiseInstruction { +pub enum Noise { Perlin, Simplex, Voronoi, } #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum FilterInstruction { +pub enum Filter { Invert, } diff --git a/crates/rpl/src/lib.rs b/crates/rpl/src/lib.rs index 0e5011e..657b07d 100644 --- a/crates/rpl/src/lib.rs +++ b/crates/rpl/src/lib.rs @@ -20,7 +20,7 @@ mod tests { use crate::instructions::{ read::{SourceFormat, SourceType}, write::{TargetFormat, TargetType}, - MathInstruction, + Math, }; #[test] @@ -40,7 +40,7 @@ mod tests { source: SourceType::File("~/example/file.png".into()), format: SourceFormat::Png }), - Instruction::Math(MathInstruction::Add), + Instruction::Math(Math::Add), Instruction::Write(instructions::write::Write { target: TargetType::File("~/example/out.jpg".into()), format: TargetFormat::Jpeg diff --git a/testfiles/bare.rpl b/testfiles/bare.ron similarity index 100% rename from testfiles/bare.rpl rename to testfiles/bare.ron diff --git a/testfiles/invert.rpl b/testfiles/invert.ron similarity index 100% rename from testfiles/invert.rpl rename to testfiles/invert.ron From fcf7e909ee98b07562d805f0ce9bd436172b139e Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 12 Jan 2024 17:23:17 +0100 Subject: [PATCH 052/189] feat(ir): replace Rpl with GraphIr Semi-broken as atm the CLI just does nothing except printing the parsed IR, instead of actually executing it. --- Cargo.lock | 117 +++++++++--------- Cargo.toml | 6 +- crates/executor/Cargo.toml | 2 +- crates/executor/src/debug/instructions/mod.rs | 4 +- crates/executor/src/debug/mod.rs | 16 +-- crates/executor/src/lib.rs | 6 +- crates/{rpl => ir}/Cargo.toml | 5 +- .../src/instruction}/mod.rs | 12 +- .../src/instruction}/read.rs | 6 +- .../src/instruction}/write.rs | 6 +- crates/ir/src/lib.rs | 108 ++++++++++++++++ crates/{rpl => ir}/src/value/mod.rs | 0 crates/rpl/src/lib.rs | 51 -------- flake.nix | 2 +- 14 files changed, 198 insertions(+), 143 deletions(-) rename crates/{rpl => ir}/Cargo.toml (62%) rename crates/{rpl/src/instructions => ir/src/instruction}/mod.rs (59%) rename crates/{rpl/src/instructions => ir/src/instruction}/read.rs (54%) rename crates/{rpl/src/instructions => ir/src/instruction}/write.rs (55%) create mode 100644 crates/ir/src/lib.rs rename crates/{rpl => ir}/src/value/mod.rs (100%) delete mode 100644 crates/rpl/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 091f8a8..733ec12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,20 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + [[package]] name = "anstream" version = "0.6.5" @@ -171,6 +185,15 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "cli" +version = "0.1.0" +dependencies = [ + "clap", + "executor", + "ir", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -271,7 +294,7 @@ version = "0.1.0" dependencies = [ "clap", "image", - "rpl", + "ir", ] [[package]] @@ -374,10 +397,13 @@ dependencies = [ ] [[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +name = "ir" +version = "0.1.0" +dependencies = [ + "ahash", + "ron", + "serde", +] [[package]] name = "jpeg-decoder" @@ -400,17 +426,6 @@ version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" -[[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall", -] - [[package]] name = "lock_api" version = "0.4.11" @@ -462,34 +477,10 @@ dependencies = [ ] [[package]] -name = "num_threads" -version = "0.1.6" +name = "once_cell" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "owo-colors" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" - -[[package]] -name = "pl-cli" -version = "0.1.0" -dependencies = [ - "clap", - "executor", - "rpl", -] +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "png" @@ -589,20 +580,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "rpl" -version = "0.1.0" -dependencies = [ - "ron", - "serde", -] - -[[package]] -name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - [[package]] name = "scopeguard" version = "1.2.0" @@ -747,6 +724,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -892,10 +875,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] -name = "yansi" -version = "0.5.1" +name = "zerocopy" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "zune-inflate" diff --git a/Cargo.toml b/Cargo.toml index c6acf53..74dd3e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,13 +2,13 @@ members = [ "crates/app", "crates/executor", - "crates/rpl" + "crates/ir", + "crates/cli", ] resolver = "2" [workspace.dependencies] -clap = { version = "4", features = [ "derive" ] } -serde = { version = "1.0", features = [ "derive" ] } +clap = { version = "4", features = ["derive"] } # to enable all the lints below, this must be present in a workspace member's Cargo.toml: # [lints] diff --git a/crates/executor/Cargo.toml b/crates/executor/Cargo.toml index 49d9685..711b9b9 100644 --- a/crates/executor/Cargo.toml +++ b/crates/executor/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] clap = { workspace = true, features = [ "derive" ] } image = "0.24" -rpl = { path = "../rpl" } +ir = { path = "../ir" } [lints] workspace = true diff --git a/crates/executor/src/debug/instructions/mod.rs b/crates/executor/src/debug/instructions/mod.rs index 7fa5531..b78c7b5 100644 --- a/crates/executor/src/debug/instructions/mod.rs +++ b/crates/executor/src/debug/instructions/mod.rs @@ -1,6 +1,6 @@ pub mod read { use image::{io::Reader as ImageReader, DynamicImage}; - use rpl::instructions::read::{Read, SourceType}; + use ir::instruction::read::{Read, SourceType}; pub fn read(Read { source, .. }: Read) -> DynamicImage { // TODO: actual error handling @@ -15,7 +15,7 @@ pub mod read { pub mod write { use image::{DynamicImage, ImageFormat}; - use rpl::instructions::write::{TargetFormat, TargetType, Write}; + use ir::instruction::write::{TargetFormat, TargetType, Write}; pub fn write(Write { target, format }: Write, input_data: &DynamicImage) { input_data diff --git a/crates/executor/src/debug/mod.rs b/crates/executor/src/debug/mod.rs index b7524d3..b9cd743 100644 --- a/crates/executor/src/debug/mod.rs +++ b/crates/executor/src/debug/mod.rs @@ -1,4 +1,4 @@ -use rpl::instructions::{Filter, Instruction}; +use ir::instruction::{Filter, Kind}; use crate::value::Dynamic; mod instructions; @@ -6,12 +6,12 @@ mod instructions; pub struct Executor; impl crate::Executor for Executor { - fn execute(instruction: Instruction, input: Option) -> Option { + fn execute(instruction: Kind, input: Option) -> Option { match instruction { - Instruction::Read(read_instruction) => { + Kind::Read(read_instruction) => { Some(Dynamic::Image(instructions::read::read(read_instruction))) } - Instruction::Write(write_instruction) => { + Kind::Write(write_instruction) => { instructions::write::write( write_instruction, match input { @@ -21,10 +21,10 @@ impl crate::Executor for Executor { ); None } - Instruction::Math(_) => todo!(), - Instruction::Blend(_) => todo!(), - Instruction::Noise(_) => todo!(), - Instruction::Filter(filter_instruction) => match filter_instruction { + Kind::Math(_) => todo!(), + Kind::Blend(_) => todo!(), + Kind::Noise(_) => todo!(), + Kind::Filter(filter_instruction) => match filter_instruction { Filter::Invert => Some(Dynamic::Image(instructions::filters::invert::invert( match input { Some(Dynamic::Image(img)) => img, diff --git a/crates/executor/src/lib.rs b/crates/executor/src/lib.rs index 9e4da44..639947e 100644 --- a/crates/executor/src/lib.rs +++ b/crates/executor/src/lib.rs @@ -1,4 +1,4 @@ -use rpl::instructions::Instruction; +use ir::instruction::Kind; use value::Dynamic; mod debug; @@ -17,10 +17,10 @@ pub enum Executors { } trait Executor { - fn execute(instruction: Instruction, input: Option) -> Option; + fn execute(instruction: Kind, input: Option) -> Option; } -pub fn execute_all(instructions: Vec) { +pub fn execute_all(instructions: Vec) { let mut tmp = None; for instruction in instructions { diff --git a/crates/rpl/Cargo.toml b/crates/ir/Cargo.toml similarity index 62% rename from crates/rpl/Cargo.toml rename to crates/ir/Cargo.toml index 7cfd2ce..1bb10f9 100644 --- a/crates/rpl/Cargo.toml +++ b/crates/ir/Cargo.toml @@ -1,13 +1,14 @@ [package] -name = "rpl" +name = "ir" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -serde = { workspace = true, features = [ "derive" ] } +ahash = { version = "0.8.7", features = ["serde"] } ron = "0.8" +serde = { version = "1.0.193", features = ["derive"] } [lints] workspace = true diff --git a/crates/rpl/src/instructions/mod.rs b/crates/ir/src/instruction/mod.rs similarity index 59% rename from crates/rpl/src/instructions/mod.rs rename to crates/ir/src/instruction/mod.rs index 76ecc22..adb46e6 100644 --- a/crates/rpl/src/instructions/mod.rs +++ b/crates/ir/src/instruction/mod.rs @@ -3,8 +3,8 @@ use serde::{Deserialize, Serialize}; pub mod read; pub mod write; -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub enum Instruction { +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum Kind { Read(read::Read), Write(write::Write), Math(Math), @@ -13,7 +13,7 @@ pub enum Instruction { Filter(Filter), } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Math { Add, Subtract, @@ -21,7 +21,7 @@ pub enum Math { Divide, } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Blend { Normal, Multiply, @@ -34,14 +34,14 @@ pub enum Blend { Lighten, } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Noise { Perlin, Simplex, Voronoi, } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum Filter { Invert, } diff --git a/crates/rpl/src/instructions/read.rs b/crates/ir/src/instruction/read.rs similarity index 54% rename from crates/rpl/src/instructions/read.rs rename to crates/ir/src/instruction/read.rs index 6ccd4d3..7f68524 100644 --- a/crates/rpl/src/instructions/read.rs +++ b/crates/ir/src/instruction/read.rs @@ -1,18 +1,18 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Read { pub source: SourceType, pub format: SourceFormat, } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum SourceType { File(PathBuf), } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum SourceFormat { Jpeg, Png, diff --git a/crates/rpl/src/instructions/write.rs b/crates/ir/src/instruction/write.rs similarity index 55% rename from crates/rpl/src/instructions/write.rs rename to crates/ir/src/instruction/write.rs index d5ea207..973fab8 100644 --- a/crates/rpl/src/instructions/write.rs +++ b/crates/ir/src/instruction/write.rs @@ -1,18 +1,18 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Write { pub target: TargetType, pub format: TargetFormat, } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum TargetType { File(PathBuf), } -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum TargetFormat { Jpeg, Png, diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs new file mode 100644 index 0000000..790221d --- /dev/null +++ b/crates/ir/src/lib.rs @@ -0,0 +1,108 @@ +use std::ops::RangeInclusive; + +use serde::{Deserialize, Serialize}; + +pub mod instruction; + +pub type Map = ahash::AHashMap; +pub type Set = ahash::AHashSet; + +/// # Errors +/// +/// Returns an error if the parsed source is not a valid graph IR. +pub fn from_ron(source: &str) -> ron::error::SpannedResult { + ron::from_str(source) +} + +/// The toplevel representation of a whole pipeline. +/// +/// Pipelines may not be fully linear. They may branch out and recombine later on. +/// As such, the representation for them which is currently used is a +/// [**D**irected **A**cyclic **G**raph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) +/// . +/// +/// For those who are already familiar with graphs, a DAG is one, except that: +/// +/// - It is **directed**: Edges have a direction they point to. +/// In this case, edges point from the outputs of streamers to inputs of consumers. +/// - It is **acyclic**: Those directed edges may not form loops. +/// In other words, if one follows edges only in their direction, it must be impossible +/// to come back to an already visited node. +/// +/// Here, if an edge points from _A_ to _B_ (`A --> B`), +/// then _A_ is called a **dependency** of _B_, +/// and _B_ is called a **dependent** of _A_. +/// +/// The DAG also enables another neat operation: +/// [Topological sorting](https://en.wikipedia.org/wiki/Topological_sorting). +/// This allows to put the entire graph into a linear list, +/// where it's guaranteed that once a vertex is visited, +/// all dependencies of it will have been visited already as well. +/// +/// The representation used here in specific is a bit more complicated, +/// since **instructions** directly aren't just connected to one another, +/// but their **sockets** are instead. +/// +/// So the vertices of the DAG are the **sockets** +/// (which are either [`id::Input`] or [`id::Output`] depending on the direction), +/// and each **socket** in turn belongs to an **instruction**. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct GraphIr { + /// "Backbone" storage of all **instruction** IDs to + /// what **kind of instruction** they are. + instructions: Map, + + /// How the data flows forward. **Dependencies** map to **dependents** here. + edges: Map>, + /// How the data flows backward. **Dependents** map to **dependencies** here. + rev_edges: Map>, +} + +pub mod id { + use serde::{Deserialize, Serialize}; + + use crate::Span; + + /// One specific instruction, and where it is found in code. + /// + /// It does **not** contain what kind of instruction this is. + /// Refer to [`crate::instruction::Kind`] for this instead. + #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] + pub struct Instruction(Span); + + impl Instruction { + /// Where this instruction is written down. + pub fn span(&self) -> &Span { + &self.0 + } + } + + /// On an **instruction**, accepts incoming data. + /// + /// An **instruction** cannot run if any of these are not connected. + #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] + pub struct Input(Socket); + + /// On an **instruction**, returns outgoing data to be fed to [`Input`]s. + /// + /// In contrast to [`Input`]s, [`Output`]s may be used or unused. + #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] + pub struct Output(Socket); + + /// An unspecified socket on a specific **instruction**, + /// and where it is on that **instruction**. + #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] + pub struct Socket { + pub belongs_to: Instruction, + pub index: SocketIdx, + } + + /// Where a [`Socket`] is on an **instruction**. + #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] + pub struct SocketIdx(pub u16); +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Span { + range: RangeInclusive, +} diff --git a/crates/rpl/src/value/mod.rs b/crates/ir/src/value/mod.rs similarity index 100% rename from crates/rpl/src/value/mod.rs rename to crates/ir/src/value/mod.rs diff --git a/crates/rpl/src/lib.rs b/crates/rpl/src/lib.rs deleted file mode 100644 index 657b07d..0000000 --- a/crates/rpl/src/lib.rs +++ /dev/null @@ -1,51 +0,0 @@ -use instructions::Instruction; -use serde::{Deserialize, Serialize}; - -pub mod instructions; - -/// # Panics -/// -/// Panics if deserialization fails. lol. -#[must_use] -pub fn from_ron(raw: &str) -> Rpl { - ron::from_str(raw).expect("come back later and handle me correctly") -} - -#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] -pub struct Rpl(pub Vec); - -#[cfg(test)] -mod tests { - use super::*; - use crate::instructions::{ - read::{SourceFormat, SourceType}, - write::{TargetFormat, TargetType}, - Math, - }; - - #[test] - fn test_simple_deserialize() { - const TEST_DATA: &str = concat!( - "([", - "Read( (source: File(\"~/example/file.png\"), format: Png) ),", - "Math(Add),", - "Write(( target: File(\"~/example/out.jpg\"), format: Jpeg)),", - "])", - ); - - assert_eq!( - from_ron(TEST_DATA), - Rpl(vec![ - Instruction::Read(instructions::read::Read { - source: SourceType::File("~/example/file.png".into()), - format: SourceFormat::Png - }), - Instruction::Math(Math::Add), - Instruction::Write(instructions::write::Write { - target: TargetType::File("~/example/out.jpg".into()), - format: TargetFormat::Jpeg - }) - ]) - ); - } -} diff --git a/flake.nix b/flake.nix index aa617a3..b0d5bde 100644 --- a/flake.nix +++ b/flake.nix @@ -40,7 +40,7 @@ just nushell typst typst-lsp mold - cargo-nextest + cargo-nextest cargo-watch ]; }) ]; From 1c3012fb325477181b95dcf82ed149175a0901ef Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 19:04:34 +0100 Subject: [PATCH 053/189] docs: fix typo --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a89a2d0..dd58b5e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Before we get started, thank you for thinking about doing so! - How did you install iOwO? - What version of iOwO are you running? - What operating system are you running? - In the case of a Linux distro, mention the specific distro and when you last update as well. + In the case of a Linux distro, mention the specific distro and when you last updated as well. - If the bug causes a crash, try to get a backtrace or in worse cases, a coredump. ### Feature requests From 23ffbe39dcbd137df5294faee785ecb5e9d7f58a Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 20:29:41 +0100 Subject: [PATCH 054/189] chore: format a bit and add `just fmt` --- CONTRIBUTING.md | 2 +- Cargo.toml | 7 +++---- docs/design/type-notation.typ | 2 +- flake.nix | 3 ++- justfile | 10 ++++++++-- testfiles/bare.ron | 8 ++++---- testfiles/invert.ron | 2 +- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dd58b5e..748fd03 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ Otherwise, we suggest these: [The Rust Programming Language book]: https://doc.rust-lang.org/book/ [typst's excellent tutorial]: https://typst.app/docs/tutorial -[Inkscape]: https://inkscape.org/ +[Inkscape]: https://inkscape.org/ [GIMP]: https://www.gimp.org/ [Blender]: https://www.blender.org/ [Penpot]: https://penpot.app/ diff --git a/Cargo.toml b/Cargo.toml index 74dd3e7..f4aa395 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,8 @@ [workspace] -members = [ - "crates/app", - "crates/executor", +members = [ + "crates/executor", "crates/ir", - "crates/cli", + "crates/cli", ] resolver = "2" diff --git a/docs/design/type-notation.typ b/docs/design/type-notation.typ index 7858b50..ee33517 100644 --- a/docs/design/type-notation.typ +++ b/docs/design/type-notation.typ @@ -32,7 +32,7 @@ One dimensional list of 32 bit signed integers: [i32] ``` -Due to inference, you'll also be able to use that in some mathematical operations with integers: +Due to inference, you'll also be able to use that in some mathematical operations with integers: `[i32] + i32` is a valid operation, for example (of course, you can't add types.) But that wouldn't add the second one to the list, but rather add the single i32 to all values in the left hand side list). That would also work with more dimensional arrays and dynamic streams like videos. diff --git a/flake.nix b/flake.nix index b0d5bde..da80ec2 100644 --- a/flake.nix +++ b/flake.nix @@ -35,9 +35,10 @@ clippy.enable = true; rustfmt.enable = true; }; - + packages = with pkgs; [ just nushell + ripgrep typst typst-lsp mold cargo-nextest cargo-watch diff --git a/justfile b/justfile index 396f6eb..468c9fb 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,9 @@ all: test docs +test: + #!/usr/bin/env nu + cargo nextest run + # Compile all documentation as in proposals and design documents, placing them under `docs/compiled`. docs: #!/usr/bin/env nu @@ -12,6 +16,8 @@ docs: mv $pdf docs/compiled } | ignore -test: +fmt: #!/usr/bin/env nu - cargo nextest run + cargo fmt + echo "Places where whitespace is at the end of a line:" + rg '\s$' diff --git a/testfiles/bare.ron b/testfiles/bare.ron index 1770e37..a9c97c8 100644 --- a/testfiles/bare.ron +++ b/testfiles/bare.ron @@ -1,12 +1,12 @@ ( [ Read(( - source: File("/home/jade/example/file.png"), - format: Png + source: File("testfiles/juan.png"), + format: Jpeg )), Write(( - target: File("/home/jade/example/out.jpg"), - format: Jpeg + target: File("testfiles/out.png"), + format: Png )) ] ) diff --git a/testfiles/invert.ron b/testfiles/invert.ron index 5f235a9..80179f1 100644 --- a/testfiles/invert.ron +++ b/testfiles/invert.ron @@ -2,7 +2,7 @@ [ Read(( source: File("testfiles/juan.jpg"), - format: Png + format: Jpeg )), Filter(Invert), Write(( From 4db6eb431776f477c4da4db71cb91a490268b9f4 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 20:35:15 +0100 Subject: [PATCH 055/189] feat(cli): don't require executor arg anymore --- crates/executor/src/lib.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/executor/src/lib.rs b/crates/executor/src/lib.rs index 639947e..9732bb0 100644 --- a/crates/executor/src/lib.rs +++ b/crates/executor/src/lib.rs @@ -7,13 +7,9 @@ mod value; /// The available executors /// unused in early dev. #[derive(Debug, Clone, Copy, clap::ValueEnum)] -pub enum Executors { +pub enum RegisteredExecutor { /// the debug executor is single threaded and really, *really* slow. And unstable. Don't use. Unless you're a dev working on this. Debug, - /// the CPU executor primarily uses the CPU. Most likely most feature complete, and the fallback. - Cpu, - /// the Vulkan executor (obviously) uses vulkan. there's a good chance this isn't implemented yet as you're reading this. - Vulkan, } trait Executor { From ee675de2024e0547c1ceaab3065e5e1107d22bce Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 21:39:19 +0100 Subject: [PATCH 056/189] feat: add semi-human-readable-and-writable-ir --- crates/ir/src/lib.rs | 99 +++++++++++++++++++++++++++++++++++++++++--- testfiles/bare.ron | 21 ++++++---- testfiles/invert.ron | 22 ++++++---- 3 files changed, 119 insertions(+), 23 deletions(-) diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 790221d..d2160af 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -7,11 +7,19 @@ pub mod instruction; pub type Map = ahash::AHashMap; pub type Set = ahash::AHashSet; +/// Gives you a super well typed graph IR for a given human-readable repr. +/// +/// Look at [`SemiHumanGraphIr`] and the test files in the repo at `testfiles/` +/// to see what the RON should look like. +/// No, we don't want you to write out [`GraphIr`] in full by hand. +/// That's something for the machines to do. +/// /// # Errors /// -/// Returns an error if the parsed source is not a valid graph IR. +/// Returns an error if the parsed source is not a valid human-readable graph IR. pub fn from_ron(source: &str) -> ron::error::SpannedResult { - ron::from_str(source) + let human_repr: SemiHumanGraphIr = ron::from_str(source)?; + Ok(human_repr.into()) } /// The toplevel representation of a whole pipeline. @@ -68,10 +76,11 @@ pub mod id { /// It does **not** contain what kind of instruction this is. /// Refer to [`crate::instruction::Kind`] for this instead. #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Instruction(Span); + pub struct Instruction(pub(super) Span); impl Instruction { /// Where this instruction is written down. + #[must_use] pub fn span(&self) -> &Span { &self.0 } @@ -81,20 +90,20 @@ pub mod id { /// /// An **instruction** cannot run if any of these are not connected. #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Input(Socket); + pub struct Input(pub(super) Socket); /// On an **instruction**, returns outgoing data to be fed to [`Input`]s. /// /// In contrast to [`Input`]s, [`Output`]s may be used or unused. #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Output(Socket); + pub struct Output(pub(super) Socket); /// An unspecified socket on a specific **instruction**, /// and where it is on that **instruction**. #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] pub struct Socket { pub belongs_to: Instruction, - pub index: SocketIdx, + pub idx: SocketIdx, } /// Where a [`Socket`] is on an **instruction**. @@ -106,3 +115,81 @@ pub mod id { pub struct Span { range: RangeInclusive, } + +// TODO: this desperately belongs into its own file, also id should get its own file +/// Semi-human-{read,writ}able [`GraphIr`] with far less useful types. +/// +/// **Do not use this if you want to programatically construct IR.** +/// Instead, directly use [`GraphIr`]. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct SemiHumanGraphIr { + /// See [`GraphIr::instructions`], just that a simple number is used for the ID instead + /// of a proper span. + instructions: Map, + /// See [`GraphIr::edges`]. RON wants you to type the set as a list. + edges: Map>, +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct SemiHumanSocket { + /// ID of the instruction this socket is on. + on: usize, + idx: u16, +} + +impl From for id::Socket { + fn from(source: SemiHumanSocket) -> Self { + Self { + belongs_to: (id::Instruction(Span { + range: source.on..=source.on, + })), + idx: id::SocketIdx(source.idx), + } + } +} + +impl From for GraphIr { + fn from(source: SemiHumanGraphIr) -> Self { + let edges = source.edges.clone(); + Self { + instructions: source + .instructions + .into_iter() + .map(|(id, kind)| (id::Instruction(Span { range: id..=id }), kind)) + .collect(), + edges: type_edges(source.edges), + // same as above, but also reverse the mapping + rev_edges: reverse_and_type_edges(edges), + } + } +} + +fn type_edges( + edges: Map>, +) -> Map> { + edges + .into_iter() + .map(|(output, inputs)| { + let output = id::Output(output.into()); + let inputs = inputs.into_iter().map(Into::into).map(id::Input).collect(); + (output, inputs) + }) + .collect() +} + +fn reverse_and_type_edges( + edges: Map>, +) -> Map> { + edges + .into_iter() + .fold(Map::new(), |mut rev_edges, (output, inputs)| { + let output = id::Output(output.into()); + + for input in inputs { + let input = id::Input(input.into()); + rev_edges.entry(input).or_default().insert(output.clone()); + } + + rev_edges + }) +} diff --git a/testfiles/bare.ron b/testfiles/bare.ron index a9c97c8..f2a9621 100644 --- a/testfiles/bare.ron +++ b/testfiles/bare.ron @@ -1,12 +1,17 @@ ( - [ - Read(( - source: File("testfiles/juan.png"), - format: Jpeg + instructions: { + 0: Read(( + source: File("testfiles/juan.jpg"), + format: Jpeg, )), - Write(( + 1: Write(( target: File("testfiles/out.png"), - format: Png - )) - ] + format: Png, + )), + }, + edges: { + (on: 0, idx: 0): [ + (on: 1, idx: 0), + ], + }, ) diff --git a/testfiles/invert.ron b/testfiles/invert.ron index 80179f1..3f1f48c 100644 --- a/testfiles/invert.ron +++ b/testfiles/invert.ron @@ -1,13 +1,17 @@ ( - [ - Read(( + instructions: { + 0: Read(( source: File("testfiles/juan.jpg"), - format: Jpeg + format: Jpeg, )), - Filter(Invert), - Write(( - target: File("testfiles/inverted.jpg"), - format: Jpeg - )) - ] + 1: Filter(Invert), + 2: Write(( + target: File("testfiles/inverted.png"), + format: Png, + )), + }, + edges: { + (on: 0, idx: 0): [(on: 1, idx: 0)], + (on: 1, idx: 0): [(on: 2, idx: 0)], + }, ) From ca8cf0cc520c793f7c8e826bb20aa3dda8dc65fa Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 21:54:41 +0100 Subject: [PATCH 057/189] chore: put semi human graph ir into its own module --- crates/ir/src/lib.rs | 84 +++---------------------------------- crates/ir/src/semi_human.rs | 82 ++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 79 deletions(-) create mode 100644 crates/ir/src/semi_human.rs diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index d2160af..034e6d2 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -4,6 +4,10 @@ use serde::{Deserialize, Serialize}; pub mod instruction; +// feel free to make this public if there's sufficient reason to do so +// otherwise, go use the GraphIr in the module this is written in directly instead!! +mod semi_human; + pub type Map = ahash::AHashMap; pub type Set = ahash::AHashSet; @@ -18,7 +22,7 @@ pub type Set = ahash::AHashSet; /// /// Returns an error if the parsed source is not a valid human-readable graph IR. pub fn from_ron(source: &str) -> ron::error::SpannedResult { - let human_repr: SemiHumanGraphIr = ron::from_str(source)?; + let human_repr: semi_human::GraphIr = ron::from_str(source)?; Ok(human_repr.into()) } @@ -115,81 +119,3 @@ pub mod id { pub struct Span { range: RangeInclusive, } - -// TODO: this desperately belongs into its own file, also id should get its own file -/// Semi-human-{read,writ}able [`GraphIr`] with far less useful types. -/// -/// **Do not use this if you want to programatically construct IR.** -/// Instead, directly use [`GraphIr`]. -#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] -pub struct SemiHumanGraphIr { - /// See [`GraphIr::instructions`], just that a simple number is used for the ID instead - /// of a proper span. - instructions: Map, - /// See [`GraphIr::edges`]. RON wants you to type the set as a list. - edges: Map>, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] -pub struct SemiHumanSocket { - /// ID of the instruction this socket is on. - on: usize, - idx: u16, -} - -impl From for id::Socket { - fn from(source: SemiHumanSocket) -> Self { - Self { - belongs_to: (id::Instruction(Span { - range: source.on..=source.on, - })), - idx: id::SocketIdx(source.idx), - } - } -} - -impl From for GraphIr { - fn from(source: SemiHumanGraphIr) -> Self { - let edges = source.edges.clone(); - Self { - instructions: source - .instructions - .into_iter() - .map(|(id, kind)| (id::Instruction(Span { range: id..=id }), kind)) - .collect(), - edges: type_edges(source.edges), - // same as above, but also reverse the mapping - rev_edges: reverse_and_type_edges(edges), - } - } -} - -fn type_edges( - edges: Map>, -) -> Map> { - edges - .into_iter() - .map(|(output, inputs)| { - let output = id::Output(output.into()); - let inputs = inputs.into_iter().map(Into::into).map(id::Input).collect(); - (output, inputs) - }) - .collect() -} - -fn reverse_and_type_edges( - edges: Map>, -) -> Map> { - edges - .into_iter() - .fold(Map::new(), |mut rev_edges, (output, inputs)| { - let output = id::Output(output.into()); - - for input in inputs { - let input = id::Input(input.into()); - rev_edges.entry(input).or_default().insert(output.clone()); - } - - rev_edges - }) -} diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs new file mode 100644 index 0000000..5d17646 --- /dev/null +++ b/crates/ir/src/semi_human.rs @@ -0,0 +1,82 @@ +//! The midterm solution for source representation, until we've got a nice source frontent. +//! +//! Sacrifices type expressivity for the sake of typability in [RON] files. +//! +//! [RON]: https://docs.rs/ron/latest/ron/ + +use serde::{Deserialize, Serialize}; + +use crate::{id, instruction, Map, Set, Span}; + +/// Semi-human-{read,writ}able [`crate::GraphIr`] with far less useful types. +/// +/// **Do not use this if you want to programatically construct IR.** +/// Instead, directly use [`crate::GraphIr`]. +#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub struct GraphIr { + /// See [`crate::GraphIr::instructions`], just that a simple number is used for the ID instead + /// of a proper span. + pub(crate) instructions: Map, + /// See [`crate::GraphIr::edges`]. RON wants you to type the set as if it were a list. + pub(crate) edges: Map>, +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Socket { + /// ID of the instruction this socket is on. + pub(crate) on: usize, + pub(crate) idx: u16, +} + +impl From for id::Socket { + fn from(source: Socket) -> Self { + Self { + belongs_to: (id::Instruction(Span { + range: source.on..=source.on, + })), + idx: id::SocketIdx(source.idx), + } + } +} + +impl From for crate::GraphIr { + fn from(source: GraphIr) -> Self { + let edges = source.edges.clone(); + Self { + instructions: source + .instructions + .into_iter() + .map(|(id, kind)| (id::Instruction(Span { range: id..=id }), kind)) + .collect(), + edges: type_edges(source.edges), + // same as above, but also reverse the mapping + rev_edges: reverse_and_type_edges(edges), + } + } +} + +fn type_edges(edges: Map>) -> Map> { + edges + .into_iter() + .map(|(output, inputs)| { + let output = id::Output(output.into()); + let inputs = inputs.into_iter().map(Into::into).map(id::Input).collect(); + (output, inputs) + }) + .collect() +} + +fn reverse_and_type_edges(edges: Map>) -> Map> { + edges + .into_iter() + .fold(Map::new(), |mut rev_edges, (output, inputs)| { + let output = id::Output(output.into()); + + for input in inputs { + let input = id::Input(input.into()); + rev_edges.entry(input).or_default().insert(output.clone()); + } + + rev_edges + }) +} From 6395efbeab06d50f7930f5e15419e84c22cde7cb Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 22:09:11 +0100 Subject: [PATCH 058/189] chore: extract id stuff into its own file --- crates/ir/src/id.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++ crates/ir/src/lib.rs | 46 +-------------------------------- 2 files changed, 62 insertions(+), 45 deletions(-) create mode 100644 crates/ir/src/id.rs diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs new file mode 100644 index 0000000..1991b27 --- /dev/null +++ b/crates/ir/src/id.rs @@ -0,0 +1,61 @@ +//! Instance identification for instructions and their glue. +//! +//! Instructions as defined in [`crate::instruction::Kind`] and descendants are very useful, +//! but they cannot be directly used as vertices in the graph IR, +//! as there may easily be multiple instructions of the same kind in the same program. +//! +//! Instead, this module offers an alternative way to refer to specific instances: +//! +//! - [`Instruction`]s are referred to as their **byte [`Span`]s** in the source code, +//! so effectively where they are written in the source code. +//! (Or if coming from [`crate::semi_human::GraphIr`], +//! it's just a fictional number floating in space.) +//! - [`Socket`]s contain +//! - what [`Instruction`] they belong to +//! - which index they occupy on it +//! +//! The distinction between [`Input`] and [`Output`] is implemented +//! as them being different types. + +use serde::{Deserialize, Serialize}; + +use crate::Span; + +/// One specific instruction, and where it is found in code. +/// +/// It does **not** contain what kind of instruction this is. +/// Refer to [`crate::instruction::Kind`] for this instead. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Instruction(pub(super) Span); + +impl Instruction { + /// Where this instruction is written down. + #[must_use] + pub fn span(&self) -> &Span { + &self.0 + } +} + +/// On an **instruction**, accepts incoming data. +/// +/// An **instruction** cannot run if any of these are not connected. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Input(pub(super) Socket); + +/// On an **instruction**, returns outgoing data to be fed to [`Input`]s. +/// +/// In contrast to [`Input`]s, [`Output`]s may be used or unused. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Output(pub(super) Socket); + +/// An unspecified socket on a specific **instruction**, +/// and where it is on that **instruction**. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct Socket { + pub belongs_to: Instruction, + pub idx: SocketIdx, +} + +/// Where a [`Socket`] is on an **instruction**. +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +pub struct SocketIdx(pub u16); diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 034e6d2..28aebf2 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -2,6 +2,7 @@ use std::ops::RangeInclusive; use serde::{Deserialize, Serialize}; +pub mod id; pub mod instruction; // feel free to make this public if there's sufficient reason to do so @@ -70,51 +71,6 @@ pub struct GraphIr { rev_edges: Map>, } -pub mod id { - use serde::{Deserialize, Serialize}; - - use crate::Span; - - /// One specific instruction, and where it is found in code. - /// - /// It does **not** contain what kind of instruction this is. - /// Refer to [`crate::instruction::Kind`] for this instead. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Instruction(pub(super) Span); - - impl Instruction { - /// Where this instruction is written down. - #[must_use] - pub fn span(&self) -> &Span { - &self.0 - } - } - - /// On an **instruction**, accepts incoming data. - /// - /// An **instruction** cannot run if any of these are not connected. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Input(pub(super) Socket); - - /// On an **instruction**, returns outgoing data to be fed to [`Input`]s. - /// - /// In contrast to [`Input`]s, [`Output`]s may be used or unused. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Output(pub(super) Socket); - - /// An unspecified socket on a specific **instruction**, - /// and where it is on that **instruction**. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct Socket { - pub belongs_to: Instruction, - pub idx: SocketIdx, - } - - /// Where a [`Socket`] is on an **instruction**. - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] - pub struct SocketIdx(pub u16); -} - #[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] pub struct Span { range: RangeInclusive, From d8e08459a0141adf399d4d31ba16ae8f724e7512 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Thu, 18 Jan 2024 22:24:03 +0100 Subject: [PATCH 059/189] docs: ensure docs are well-linked, fed and washed --- crates/ir/src/lib.rs | 10 +++------- crates/ir/src/semi_human.rs | 4 ++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 28aebf2..b7ac34c 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -4,17 +4,14 @@ use serde::{Deserialize, Serialize}; pub mod id; pub mod instruction; - -// feel free to make this public if there's sufficient reason to do so -// otherwise, go use the GraphIr in the module this is written in directly instead!! -mod semi_human; +pub mod semi_human; pub type Map = ahash::AHashMap; pub type Set = ahash::AHashSet; /// Gives you a super well typed graph IR for a given human-readable repr. /// -/// Look at [`SemiHumanGraphIr`] and the test files in the repo at `testfiles/` +/// Look at [`semi_human::GraphIr`] and the test files in the repo at `testfiles/` /// to see what the RON should look like. /// No, we don't want you to write out [`GraphIr`] in full by hand. /// That's something for the machines to do. @@ -31,8 +28,7 @@ pub fn from_ron(source: &str) -> ron::error::SpannedResult { /// /// Pipelines may not be fully linear. They may branch out and recombine later on. /// As such, the representation for them which is currently used is a -/// [**D**irected **A**cyclic **G**raph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) -/// . +/// [**D**irected **A**cyclic **G**raph](https://en.wikipedia.org/wiki/Directed_acyclic_graph). /// /// For those who are already familiar with graphs, a DAG is one, except that: /// diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs index 5d17646..84bc494 100644 --- a/crates/ir/src/semi_human.rs +++ b/crates/ir/src/semi_human.rs @@ -2,6 +2,10 @@ //! //! Sacrifices type expressivity for the sake of typability in [RON] files. //! +//! **If you want to construct a graph IR programmatically, +//! use [`crate::GraphIr`] directly instead, +//! as it gives you more control to specify where your instructions came from.** +//! //! [RON]: https://docs.rs/ron/latest/ron/ use serde::{Deserialize, Serialize}; From 29269e2fcde8e31f8aa6488f6e895fb3ed1d7be4 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 00:45:01 +0100 Subject: [PATCH 060/189] feat(ir): implement resolve functionality (untested) --- Cargo.lock | 70 --------------- crates/ir/Cargo.toml | 1 - crates/ir/src/id.rs | 24 +++-- crates/ir/src/instruction/mod.rs | 44 ++++++++-- crates/ir/src/instruction/read.rs | 6 +- crates/ir/src/instruction/write.rs | 6 +- crates/ir/src/lib.rs | 135 +++++++++++++++++++++++++++-- crates/ir/src/semi_human.rs | 18 ++-- 8 files changed, 203 insertions(+), 101 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 733ec12..529a1a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,20 +8,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "serde", - "version_check", - "zerocopy", -] - [[package]] name = "anstream" version = "0.6.5" @@ -341,17 +327,6 @@ dependencies = [ "spin", ] -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "gif" version = "0.12.0" @@ -400,7 +375,6 @@ dependencies = [ name = "ir" version = "0.1.0" dependencies = [ - "ahash", "ron", "serde", ] @@ -420,12 +394,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" -[[package]] -name = "libc" -version = "0.2.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" - [[package]] name = "lock_api" version = "0.4.11" @@ -476,12 +444,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - [[package]] name = "png" version = "0.17.10" @@ -724,18 +686,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - [[package]] name = "weezl" version = "0.1.7" @@ -874,26 +824,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/crates/ir/Cargo.toml b/crates/ir/Cargo.toml index 1bb10f9..fdd00e8 100644 --- a/crates/ir/Cargo.toml +++ b/crates/ir/Cargo.toml @@ -6,7 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -ahash = { version = "0.8.7", features = ["serde"] } ron = "0.8" serde = { version = "1.0.193", features = ["derive"] } diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs index 1991b27..315bc6f 100644 --- a/crates/ir/src/id.rs +++ b/crates/ir/src/id.rs @@ -25,7 +25,7 @@ use crate::Span; /// /// It does **not** contain what kind of instruction this is. /// Refer to [`crate::instruction::Kind`] for this instead. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Instruction(pub(super) Span); impl Instruction { @@ -39,23 +39,37 @@ impl Instruction { /// On an **instruction**, accepts incoming data. /// /// An **instruction** cannot run if any of these are not connected. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Input(pub(super) Socket); +impl Input { + #[must_use] + pub fn socket(&self) -> &Socket { + &self.0 + } +} + /// On an **instruction**, returns outgoing data to be fed to [`Input`]s. /// /// In contrast to [`Input`]s, [`Output`]s may be used or unused. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Output(pub(super) Socket); +impl Output { + #[must_use] + pub fn socket(&self) -> &Socket { + &self.0 + } +} + /// An unspecified socket on a specific **instruction**, /// and where it is on that **instruction**. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Socket { pub belongs_to: Instruction, pub idx: SocketIdx, } /// Where a [`Socket`] is on an **instruction**. -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct SocketIdx(pub u16); diff --git a/crates/ir/src/instruction/mod.rs b/crates/ir/src/instruction/mod.rs index adb46e6..069fa4f 100644 --- a/crates/ir/src/instruction/mod.rs +++ b/crates/ir/src/instruction/mod.rs @@ -3,8 +3,10 @@ use serde::{Deserialize, Serialize}; pub mod read; pub mod write; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Kind { + // TODO: `read::Read` and `write::Write` hold real values atm -- they should actually + // point to `Const` instructions instead (which are... yet to be done...) Read(read::Read), Write(write::Write), Math(Math), @@ -13,7 +15,7 @@ pub enum Kind { Filter(Filter), } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Math { Add, Subtract, @@ -21,7 +23,7 @@ pub enum Math { Divide, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Blend { Normal, Multiply, @@ -34,14 +36,46 @@ pub enum Blend { Lighten, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Noise { Perlin, Simplex, Voronoi, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum Filter { Invert, } + +// TODO: given that this basically matches on all instructions, we may need to use +// the visitor pattern in future here, or at least get them behind traits +// which should allow far more nuanced description +impl Kind { + /// Returns how many sockets this kind of instruction has. + #[must_use] + pub fn socket_count(&self) -> SocketCount { + match self { + Self::Read(_) => (0, 1), + Self::Write(_) => (1, 0), + Self::Math(_) | Self::Blend(_) => (2, 1), + Self::Noise(_) => { + todo!("how many arguments does noise take? how many outputs does it have?") + } + Self::Filter(Filter::Invert) => (1, 1), + } + .into() + } +} + +/// How many sockets are on an instruction? +pub struct SocketCount { + pub inputs: u16, + pub outputs: u16, +} + +impl From<(u16, u16)> for SocketCount { + fn from((inputs, outputs): (u16, u16)) -> Self { + Self { inputs, outputs } + } +} diff --git a/crates/ir/src/instruction/read.rs b/crates/ir/src/instruction/read.rs index 7f68524..dfb2275 100644 --- a/crates/ir/src/instruction/read.rs +++ b/crates/ir/src/instruction/read.rs @@ -1,18 +1,18 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Read { pub source: SourceType, pub format: SourceFormat, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum SourceType { File(PathBuf), } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum SourceFormat { Jpeg, Png, diff --git a/crates/ir/src/instruction/write.rs b/crates/ir/src/instruction/write.rs index 973fab8..8e9311b 100644 --- a/crates/ir/src/instruction/write.rs +++ b/crates/ir/src/instruction/write.rs @@ -1,18 +1,18 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Write { pub target: TargetType, pub format: TargetFormat, } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum TargetType { File(PathBuf), } -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum TargetFormat { Jpeg, Png, diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index b7ac34c..316e31d 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -1,13 +1,17 @@ -use std::ops::RangeInclusive; +use std::{ + collections::{BTreeMap, BTreeSet}, + ops::RangeInclusive, +}; +use instruction::SocketCount; use serde::{Deserialize, Serialize}; pub mod id; pub mod instruction; pub mod semi_human; -pub type Map = ahash::AHashMap; -pub type Set = ahash::AHashSet; +pub type Map = std::collections::BTreeMap; +pub type Set = std::collections::BTreeSet; /// Gives you a super well typed graph IR for a given human-readable repr. /// @@ -64,10 +68,127 @@ pub struct GraphIr { /// How the data flows forward. **Dependencies** map to **dependents** here. edges: Map>, /// How the data flows backward. **Dependents** map to **dependencies** here. - rev_edges: Map>, + rev_edges: Map, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] -pub struct Span { - range: RangeInclusive, +impl GraphIr { + // TODO: this function, but actually the whole module, screams for tests + /// Returns the instruction corresponding to the given ID. + /// Returns [`None`] if there is no such instruction in this graph IR. + /// + /// Theoretically this could be fixed easily at the expense of some memory + /// by just incrementing and storing some global counter, + /// however, at the moment there's no compelling reason + /// to actually have multiple [`GraphIr`]s at one point in time. + /// Open an issue if that poses a problem for you. + #[must_use] + pub fn resolve<'ir>(&'ir self, id: &id::Instruction) -> Option> { + let (id, kind) = self.instructions.get_key_value(id)?; + + // just try each slot and see if it's connected + // very crude, but it works for a proof of concept + let SocketCount { inputs, outputs } = kind.socket_count(); + let socket = |id: &id::Instruction, idx| id::Socket { + belongs_to: id.clone(), + // impossible since the length is limited to a u16 already + #[allow(clippy::cast_possible_truncation)] + idx: id::SocketIdx(idx as u16), + }; + + let mut inputs_from = vec![None; inputs.into()]; + for (idx, slot) in inputs_from.iter_mut().enumerate() { + let input = id::Input(socket(id, idx)); + *slot = self.rev_edges.get(&input); + } + + let mut outputs_to = vec![None; outputs.into()]; + for (idx, slot) in outputs_to.iter_mut().enumerate() { + let output = id::Output(socket(id, idx)); + *slot = self.edges.get(&output); + } + + Some(Instruction { + id, + kind, + inputs_from, + outputs_to, + }) + } + + /// Returns the instruction this input belongs to. + /// + /// The same caveats as for [`GraphIr::resolve`] apply. + #[must_use] + pub fn owner_of_input<'ir>(&'ir self, input: &id::Input) -> Option> { + self.resolve(&input.socket().belongs_to) + } + + /// Returns the instruction this output belongs to. + /// + /// The same caveats as for [`GraphIr::resolve`] apply. + #[must_use] + pub fn owner_of_output<'ir>(&'ir self, output: &id::Output) -> Option> { + self.resolve(&output.socket().belongs_to) + } + + #[must_use] + pub fn topological_sort(&self) -> Vec { + // count how many incoming edges each vertex has + // chances are the BTreeMap is overkill + let incoming_counts: BTreeMap<_, _> = self + .rev_edges + .iter() + .map(|(input, _)| (self.owner_of_input(input), 1)) + .collect(); + + todo!() + } +} + +/// A full instruction in context, with its inputs and outputs. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Instruction<'ir> { + pub id: &'ir id::Instruction, + pub kind: &'ir instruction::Kind, + + // can't have these two public since then a user might corrupt their length + inputs_from: Vec>, + outputs_to: Vec>>, +} + +impl<'ir> Instruction<'ir> { + /// Where this instruction gets its inputs from. + /// + /// [`None`] means that this input is unfilled, + /// and must be filled before the instruction can be ran. + #[must_use] + pub fn inputs_from(&self) -> &[Option<&'ir id::Output>] { + &self.inputs_from + } + + /// To whom outputs are sent. [`None`] means that this output is unused. + #[must_use] + pub fn outputs_to(&self) -> &[Option<&'ir BTreeSet>] { + &self.outputs_to + } +} + +/// Some part referred to in source code. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub struct Span { + // would love to use an actual [`std::ops::RangeInclusive`], but those don't implement + // `PartialOrd` and `Ord` unfortunately + /// At which byte this span starts, inclusively. + pub from: usize, + /// At which byte this span ends, inclusively. + pub to: usize, +} + +impl From> for Span { + fn from(range: RangeInclusive) -> Self { + Self { + from: *range.start(), + to: *range.end(), + } + } } diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs index 84bc494..6e63176 100644 --- a/crates/ir/src/semi_human.rs +++ b/crates/ir/src/semi_human.rs @@ -21,11 +21,12 @@ pub struct GraphIr { /// See [`crate::GraphIr::instructions`], just that a simple number is used for the ID instead /// of a proper span. pub(crate) instructions: Map, - /// See [`crate::GraphIr::edges`]. RON wants you to type the set as if it were a list. + /// See [`crate::GraphIr::edges`], the forward edges. + /// RON wants you to type the set as if it were a list. pub(crate) edges: Map>, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)] pub struct Socket { /// ID of the instruction this socket is on. pub(crate) on: usize, @@ -36,7 +37,8 @@ impl From for id::Socket { fn from(source: Socket) -> Self { Self { belongs_to: (id::Instruction(Span { - range: source.on..=source.on, + from: source.on, + to: source.on, })), idx: id::SocketIdx(source.idx), } @@ -50,10 +52,9 @@ impl From for crate::GraphIr { instructions: source .instructions .into_iter() - .map(|(id, kind)| (id::Instruction(Span { range: id..=id }), kind)) + .map(|(id, kind)| (id::Instruction(Span { from: id, to: id }), kind)) .collect(), edges: type_edges(source.edges), - // same as above, but also reverse the mapping rev_edges: reverse_and_type_edges(edges), } } @@ -70,7 +71,7 @@ fn type_edges(edges: Map>) -> Map .collect() } -fn reverse_and_type_edges(edges: Map>) -> Map> { +fn reverse_and_type_edges(edges: Map>) -> Map { edges .into_iter() .fold(Map::new(), |mut rev_edges, (output, inputs)| { @@ -78,7 +79,10 @@ fn reverse_and_type_edges(edges: Map>) -> Map Date: Fri, 19 Jan 2024 02:01:30 +0100 Subject: [PATCH 061/189] feat(ir): dependents and dependencies --- Cargo.lock | 1 + crates/ir/Cargo.toml | 1 + crates/ir/src/lib.rs | 136 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 126 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 529a1a9..e191631 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -375,6 +375,7 @@ dependencies = [ name = "ir" version = "0.1.0" dependencies = [ + "either", "ron", "serde", ] diff --git a/crates/ir/Cargo.toml b/crates/ir/Cargo.toml index fdd00e8..77f8de4 100644 --- a/crates/ir/Cargo.toml +++ b/crates/ir/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +either = "1.9" ron = "0.8" serde = { version = "1.0.193", features = ["derive"] } diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 316e31d..cfe93aa 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -1,8 +1,6 @@ -use std::{ - collections::{BTreeMap, BTreeSet}, - ops::RangeInclusive, -}; +use std::{collections::BTreeSet, iter, ops::RangeInclusive}; +use either::Either; use instruction::SocketCount; use serde::{Deserialize, Serialize}; @@ -72,6 +70,56 @@ pub struct GraphIr { } impl GraphIr { + /// Look "forwards" in the graph to see what other instructions this instruction feeds into. + /// + /// The output slots represent the top-level iterator, + /// and each one's connections are emitted one level below. + /// + /// Just [`Iterator::flatten`] if you are not interested in the slots. + /// + /// The same caveats as for [`GraphIr::resolve`] apply. + #[must_use] + pub fn dependents( + &self, + subject: &id::Instruction, + ) -> Option> + '_> { + let (subject, kind) = self.instructions.get_key_value(subject)?; + let SocketCount { inputs, .. } = kind.socket_count(); + + Some((0..inputs).map(|idx| { + let output = id::Output(socket(subject, idx)); + self.edges + .get(&output) + .map_or(Either::Right(iter::empty()), |targets| { + Either::Left(targets.iter().map(|input| &input.socket().belongs_to)) + }) + })) + } + + /// Look "backwards" in the graph, + /// and find out what instructions need to be done before this one. + /// The input slots are visited in order. + /// + /// - The iterator returns individually [`Some`]`(`[`None`]`)` if the corresponding slot is + /// not connected. + /// + /// The same caveats as for [`GraphIr::resolve`] apply. + #[must_use] + pub fn dependencies( + &self, + subject: &id::Instruction, + ) -> Option> + '_> { + let (subject, kind) = self.instructions.get_key_value(subject)?; + let SocketCount { inputs, .. } = kind.socket_count(); + + Some((0..inputs).map(|idx| { + let input = id::Input(socket(subject, idx)); + self.rev_edges + .get(&input) + .map(|output| &output.socket().belongs_to) + })) + } + // TODO: this function, but actually the whole module, screams for tests /// Returns the instruction corresponding to the given ID. /// Returns [`None`] if there is no such instruction in this graph IR. @@ -82,8 +130,8 @@ impl GraphIr { /// to actually have multiple [`GraphIr`]s at one point in time. /// Open an issue if that poses a problem for you. #[must_use] - pub fn resolve<'ir>(&'ir self, id: &id::Instruction) -> Option> { - let (id, kind) = self.instructions.get_key_value(id)?; + pub fn resolve<'ir>(&'ir self, subject: &id::Instruction) -> Option> { + let (id, kind) = self.instructions.get_key_value(subject)?; // just try each slot and see if it's connected // very crude, but it works for a proof of concept @@ -131,17 +179,73 @@ impl GraphIr { self.resolve(&output.socket().belongs_to) } + /// Returns the order in which the instructions could be visited + /// in order to ensure that all dependencies are resolved + /// before a vertex is visited. + /// + /// # Panics + /// + /// Panics if there are any cycles in the IR, as it needs to be a DAG. #[must_use] + // yes, this function could actually return an iterator and be lazy + // no, not today pub fn topological_sort(&self) -> Vec { // count how many incoming edges each vertex has - // chances are the BTreeMap is overkill - let incoming_counts: BTreeMap<_, _> = self - .rev_edges - .iter() - .map(|(input, _)| (self.owner_of_input(input), 1)) + let input_counts: Map<_, usize> = + self.rev_edges + .iter() + .fold(Map::new(), |mut count, (input, _)| { + *count.entry(input.socket().belongs_to.clone()).or_default() += 1; + count + }); + + // could experiment with a VecDeque here + let mut active_queue = Vec::new(); + + // what vertices can we start with? in other words, which ones have 0 inputs? + let unresolved_input_count: Map = input_counts + .into_iter() + .filter_map(|(instr, count)| { + dbg!(count); + if count == 0 { + active_queue.push(instr); + None + } else { + Some((instr, count)) + } + }) .collect(); - todo!() + // then let's find the order! + let mut order = Vec::new(); + + while let Some(current) = active_queue.pop() { + // now that this vertex is visited and resolved, + // make sure all dependents notice that + + for dependent in self + .dependents(¤t) + .expect("graph to be consistent") + .flatten() + { + dbg!(dependent); + } + + order.push(self.resolve(¤t).expect("graph to be consistent")); + } + + assert!( + !unresolved_input_count.is_empty(), + concat!( + "topological sort didn't cover all instructions\n", + "either there are unconnected inputs, or there is a cycle\n", + "unresolved instructions:\n", + "{:#?}" + ), + unresolved_input_count + ); + + order } } @@ -192,3 +296,11 @@ impl From> for Span { } } } + +/// Constructs an [`id::Socket`] a bit more tersely. +fn socket(id: &id::Instruction, idx: u16) -> id::Socket { + id::Socket { + belongs_to: id.clone(), + idx: id::SocketIdx(idx), + } +} From 4fd35736d5469e82cb7d3fe5e77e0a8ac09f7bba Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 02:10:27 +0100 Subject: [PATCH 062/189] feat(ir): rethink logic for finding vertices with no inputs --- crates/ir/src/lib.rs | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index cfe93aa..86f2ff4 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -191,7 +191,7 @@ impl GraphIr { // no, not today pub fn topological_sort(&self) -> Vec { // count how many incoming edges each vertex has - let input_counts: Map<_, usize> = + let nonzero_input_counts: Map<_, usize> = self.rev_edges .iter() .fold(Map::new(), |mut count, (input, _)| { @@ -199,22 +199,14 @@ impl GraphIr { count }); - // could experiment with a VecDeque here - let mut active_queue = Vec::new(); - - // what vertices can we start with? in other words, which ones have 0 inputs? - let unresolved_input_count: Map = input_counts - .into_iter() - .filter_map(|(instr, count)| { - dbg!(count); - if count == 0 { - active_queue.push(instr); - None - } else { - Some((instr, count)) - } - }) - .collect(); + // are there any unconnected ones we could start with? + // TODO: experiment if a VecDeque with some ordering fun is digested better by the executor + let no_inputs: Vec<_> = { + let nonzero: Set<_> = nonzero_input_counts.keys().collect(); + let all: Set<_> = self.instructions.keys().collect(); + all.difference(&nonzero).copied().collect() + }; + let mut active_queue = no_inputs; // then let's find the order! let mut order = Vec::new(); @@ -224,25 +216,27 @@ impl GraphIr { // make sure all dependents notice that for dependent in self - .dependents(¤t) + .dependents(current) .expect("graph to be consistent") .flatten() { dbg!(dependent); } - order.push(self.resolve(¤t).expect("graph to be consistent")); + // TODO: check if this instruction is "well-fed", that is, has all the inputs it needs, + // and if not, panic + order.push(self.resolve(current).expect("graph to be consistent")); } assert!( - !unresolved_input_count.is_empty(), + !nonzero_input_counts.is_empty(), concat!( "topological sort didn't cover all instructions\n", "either there are unconnected inputs, or there is a cycle\n", "unresolved instructions:\n", "{:#?}" ), - unresolved_input_count + nonzero_input_counts, ); order From fa2893bc77024915112fec79374e4b82b8b9c8b5 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 02:59:15 +0100 Subject: [PATCH 063/189] feat(ir): actually get toposort working --- crates/ir/src/lib.rs | 153 +++++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 78 deletions(-) diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 86f2ff4..3865d64 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -1,6 +1,5 @@ -use std::{collections::BTreeSet, iter, ops::RangeInclusive}; +use std::{num::NonZeroUsize, ops::RangeInclusive}; -use either::Either; use instruction::SocketCount; use serde::{Deserialize, Serialize}; @@ -9,7 +8,7 @@ pub mod instruction; pub mod semi_human; pub type Map = std::collections::BTreeMap; -pub type Set = std::collections::BTreeSet; +pub type Set = std::collections::BTreeSet; /// Gives you a super well typed graph IR for a given human-readable repr. /// @@ -41,8 +40,8 @@ pub fn from_ron(source: &str) -> ron::error::SpannedResult { /// to come back to an already visited node. /// /// Here, if an edge points from _A_ to _B_ (`A --> B`), -/// then _A_ is called a **dependency** of _B_, -/// and _B_ is called a **dependent** of _A_. +/// then _A_ is called a **dependency** or an **input source** of _B_, +/// and _B_ is called a **dependent** or an **output target** of _A_. /// /// The DAG also enables another neat operation: /// [Topological sorting](https://en.wikipedia.org/wiki/Topological_sorting). @@ -69,33 +68,8 @@ pub struct GraphIr { rev_edges: Map, } +// TODO: this impl block, but actually the whole module, screams for tests impl GraphIr { - /// Look "forwards" in the graph to see what other instructions this instruction feeds into. - /// - /// The output slots represent the top-level iterator, - /// and each one's connections are emitted one level below. - /// - /// Just [`Iterator::flatten`] if you are not interested in the slots. - /// - /// The same caveats as for [`GraphIr::resolve`] apply. - #[must_use] - pub fn dependents( - &self, - subject: &id::Instruction, - ) -> Option> + '_> { - let (subject, kind) = self.instructions.get_key_value(subject)?; - let SocketCount { inputs, .. } = kind.socket_count(); - - Some((0..inputs).map(|idx| { - let output = id::Output(socket(subject, idx)); - self.edges - .get(&output) - .map_or(Either::Right(iter::empty()), |targets| { - Either::Left(targets.iter().map(|input| &input.socket().belongs_to)) - }) - })) - } - /// Look "backwards" in the graph, /// and find out what instructions need to be done before this one. /// The input slots are visited in order. @@ -105,22 +79,41 @@ impl GraphIr { /// /// The same caveats as for [`GraphIr::resolve`] apply. #[must_use] - pub fn dependencies( + pub fn input_sources( &self, subject: &id::Instruction, - ) -> Option> + '_> { + ) -> Option> + '_> { let (subject, kind) = self.instructions.get_key_value(subject)?; let SocketCount { inputs, .. } = kind.socket_count(); Some((0..inputs).map(|idx| { let input = id::Input(socket(subject, idx)); - self.rev_edges - .get(&input) - .map(|output| &output.socket().belongs_to) + self.rev_edges.get(&input) + })) + } + + /// Look "forwards" in the graph to see what other instructions this instruction feeds into. + /// + /// The output slots represent the top-level iterator, + /// and each one's connections are emitted one level below. + /// + /// Just [`Iterator::flatten`] if you are not interested in the slots. + /// + /// The same caveats as for [`GraphIr::resolve`] apply. + #[must_use] + pub fn output_targets( + &self, + subject: &id::Instruction, + ) -> Option>> + '_> { + let (subject, kind) = self.instructions.get_key_value(subject)?; + let SocketCount { outputs, .. } = kind.socket_count(); + + Some((0..outputs).map(|idx| { + let output = id::Output(socket(subject, idx)); + self.edges.get(&output) })) } - // TODO: this function, but actually the whole module, screams for tests /// Returns the instruction corresponding to the given ID. /// Returns [`None`] if there is no such instruction in this graph IR. /// @@ -133,33 +126,14 @@ impl GraphIr { pub fn resolve<'ir>(&'ir self, subject: &id::Instruction) -> Option> { let (id, kind) = self.instructions.get_key_value(subject)?; - // just try each slot and see if it's connected - // very crude, but it works for a proof of concept - let SocketCount { inputs, outputs } = kind.socket_count(); - let socket = |id: &id::Instruction, idx| id::Socket { - belongs_to: id.clone(), - // impossible since the length is limited to a u16 already - #[allow(clippy::cast_possible_truncation)] - idx: id::SocketIdx(idx as u16), - }; - - let mut inputs_from = vec![None; inputs.into()]; - for (idx, slot) in inputs_from.iter_mut().enumerate() { - let input = id::Input(socket(id, idx)); - *slot = self.rev_edges.get(&input); - } - - let mut outputs_to = vec![None; outputs.into()]; - for (idx, slot) in outputs_to.iter_mut().enumerate() { - let output = id::Output(socket(id, idx)); - *slot = self.edges.get(&output); - } + let input_sources = self.input_sources(subject)?.collect(); + let output_targets = self.output_targets(subject)?.collect(); Some(Instruction { id, kind, - inputs_from, - outputs_to, + input_sources, + output_targets, }) } @@ -187,15 +161,18 @@ impl GraphIr { /// /// Panics if there are any cycles in the IR, as it needs to be a DAG. #[must_use] - // yes, this function could actually return an iterator and be lazy + // yes, this function could probably return an iterator and be lazy // no, not today pub fn topological_sort(&self) -> Vec { // count how many incoming edges each vertex has - let nonzero_input_counts: Map<_, usize> = + let mut nonzero_input_counts: Map<_, NonZeroUsize> = self.rev_edges .iter() .fold(Map::new(), |mut count, (input, _)| { - *count.entry(input.socket().belongs_to.clone()).or_default() += 1; + let _ = *count + .entry(input.socket().belongs_to.clone()) + .and_modify(|count| *count = count.saturating_add(1)) + .or_insert(NonZeroUsize::MIN); count }); @@ -204,32 +181,52 @@ impl GraphIr { let no_inputs: Vec<_> = { let nonzero: Set<_> = nonzero_input_counts.keys().collect(); let all: Set<_> = self.instructions.keys().collect(); - all.difference(&nonzero).copied().collect() + all.difference(&nonzero).copied().cloned().collect() }; - let mut active_queue = no_inputs; // then let's find the order! let mut order = Vec::new(); + let mut active_queue = no_inputs; while let Some(current) = active_queue.pop() { // now that this vertex is visited and resolved, // make sure all dependents notice that - for dependent in self - .dependents(current) + let dependents = self + .output_targets(¤t) .expect("graph to be consistent") .flatten() - { - dbg!(dependent); + .flatten(); + + for dependent_input in dependents { + let dependent = &dependent_input.socket().belongs_to; + + // how many inputs are connected to this dependent without us? + let count = nonzero_input_counts + .get_mut(dependent) + .expect("connected output must refer to non-zero input"); + + let new = NonZeroUsize::new(count.get() - 1); + if let Some(new) = new { + // aww, still some + *count = new; + continue; + } + + // none, that means this one is free now! let's throw it onto the active queue then + let (now_active, _) = nonzero_input_counts + .remove_entry(dependent) + .expect("connected output must refer to non-zero input"); + active_queue.push(now_active); } // TODO: check if this instruction is "well-fed", that is, has all the inputs it needs, // and if not, panic - order.push(self.resolve(current).expect("graph to be consistent")); + order.push(self.resolve(¤t).expect("graph to be consistent")); } assert!( - !nonzero_input_counts.is_empty(), + nonzero_input_counts.is_empty(), concat!( "topological sort didn't cover all instructions\n", "either there are unconnected inputs, or there is a cycle\n", @@ -250,8 +247,8 @@ pub struct Instruction<'ir> { pub kind: &'ir instruction::Kind, // can't have these two public since then a user might corrupt their length - inputs_from: Vec>, - outputs_to: Vec>>, + input_sources: Vec>, + output_targets: Vec>>, } impl<'ir> Instruction<'ir> { @@ -260,14 +257,14 @@ impl<'ir> Instruction<'ir> { /// [`None`] means that this input is unfilled, /// and must be filled before the instruction can be ran. #[must_use] - pub fn inputs_from(&self) -> &[Option<&'ir id::Output>] { - &self.inputs_from + pub fn input_sources(&self) -> &[Option<&'ir id::Output>] { + &self.input_sources } - /// To whom outputs are sent. [`None`] means that this output is unused. + /// To whom outputs are sent. #[must_use] - pub fn outputs_to(&self) -> &[Option<&'ir BTreeSet>] { - &self.outputs_to + pub fn output_targets(&self) -> &[Option<&'ir Set>] { + &self.output_targets } } From 5a209ab5afaa8e6791c1aaa17ac203944b33c320 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 12:07:09 +0100 Subject: [PATCH 064/189] docs: fix typo --- crates/ir/src/semi_human.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs index 6e63176..64dae43 100644 --- a/crates/ir/src/semi_human.rs +++ b/crates/ir/src/semi_human.rs @@ -1,4 +1,4 @@ -//! The midterm solution for source representation, until we've got a nice source frontent. +//! The midterm solution for source representation, until we've got a nice source frontend. //! //! Sacrifices type expressivity for the sake of typability in [RON] files. //! From 87343f0a38c70c0c30a1b5697f7a770ef9805869 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 14:09:07 +0100 Subject: [PATCH 065/189] meta: add license --- .gitignore | 2 +- LICENSE | 676 ++++++++++++++++++++++++++++++++++++++++++++ testfiles/juan.jpg | Bin 91131 -> 0 bytes testfiles/rails.png | Bin 0 -> 1957904 bytes 4 files changed, 677 insertions(+), 1 deletion(-) create mode 100644 LICENSE delete mode 100644 testfiles/juan.jpg create mode 100644 testfiles/rails.png diff --git a/.gitignore b/.gitignore index b2f817b..49067bd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ /target .pre-commit-config.yaml *.pdf -*.png +/docs/*.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fc3bcbd --- /dev/null +++ b/LICENSE @@ -0,0 +1,676 @@ +The main program and its libraries are licensed under the AGPL 3.0 +as listed below the separator line. + +Media samples in the testfiles folder are licensed under CC BY-SA 4.0. +To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ +The appropiate authors are given below, in the format of +`- file/path: author (link to author)` + +- testfiles/rails.png: Schrottkatze (https://forge.katzen.cafe/schrottkatze) + +=============================================================================== + +iOwO: media pipeline toolset +Copyright (C) 2024 Schrottkatze, MultisampledNight and iOwO contributors + + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/testfiles/juan.jpg b/testfiles/juan.jpg deleted file mode 100644 index 2c4399f2464af28375c542bacb36e482cc613c90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91131 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

w43$whsb86}Y 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

HPm?&h4F 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 diff --git a/testfiles/rails.png b/testfiles/rails.png new file mode 100644 index 0000000000000000000000000000000000000000..32796bee3ff253c787e8cd541e887d8c3484d9eb GIT binary patch literal 1957904 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

QtHKF%-}`|DZ{!}X`~)P4Q* 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

cl2I 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

hV^pjgtMK_en9=Mj-uqS8%@5V{V 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

4Ey}5R7A01BhP79; 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

&3y+Pl7qCl`lPiqB!+W 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 lF_8`|XOY~5`*L+C$WO~viU&UO`-Ex%2;TamXa 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

SI;x!y#N2HOgY)q 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 z

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ⅅ6uJFwM+EnB72l`F7{S_$D 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
)ZpUlw&#hJbWiJ$?PN_6oLIck9*}i{< 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 z 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%0AQ&RMXfI4q>xdVyQm)-pN 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

f>knzqIejd;hf}W2?-Qo*A!_ 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

~&(Sm}eDHEze*UM#&(kR{Af~V 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

IEUo@D$ zC|lFA{r`qaNt-#RD}A=ay;RtHqgQrY@y%!R{(14uvpTdTDF3tr-`?8S%2qFhV)Nea zTDnkK6OFp-HVf}qk9*B%ywM3P0CBzTI+YN>%0D~ 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 V*#aQtIp(ThZJw@vF6*2UngBZ&)U^Nr literal 0 HcmV?d00001 From cdf42417da31b20da833d9ffe3754cddb35cc6eb Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 14:26:20 +0100 Subject: [PATCH 066/189] refactor(ir): use u64 directly instead of spans for instructions --- crates/ir/src/id.rs | 20 ++++---------------- crates/ir/src/lib.rs | 22 +--------------------- crates/ir/src/semi_human.rs | 14 +++++--------- 3 files changed, 10 insertions(+), 46 deletions(-) diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs index 315bc6f..a55806e 100644 --- a/crates/ir/src/id.rs +++ b/crates/ir/src/id.rs @@ -6,10 +6,8 @@ //! //! Instead, this module offers an alternative way to refer to specific instances: //! -//! - [`Instruction`]s are referred to as their **byte [`Span`]s** in the source code, -//! so effectively where they are written in the source code. -//! (Or if coming from [`crate::semi_human::GraphIr`], -//! it's just a fictional number floating in space.) +//! - [`Instruction`]s are effectively just a number floating in space, +//! incremented each time a new instruction is referred to. //! - [`Socket`]s contain //! - what [`Instruction`] they belong to //! - which index they occupy on it @@ -19,22 +17,12 @@ use serde::{Deserialize, Serialize}; -use crate::Span; - -/// One specific instruction, and where it is found in code. +/// One specific instruction. /// /// It does **not** contain what kind of instruction this is. /// Refer to [`crate::instruction::Kind`] for this instead. #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct Instruction(pub(super) Span); - -impl Instruction { - /// Where this instruction is written down. - #[must_use] - pub fn span(&self) -> &Span { - &self.0 - } -} +pub struct Instruction(pub(super) u64); /// On an **instruction**, accepts incoming data. /// diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 3865d64..ef7a23d 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -1,4 +1,4 @@ -use std::{num::NonZeroUsize, ops::RangeInclusive}; +use std::num::NonZeroUsize; use instruction::SocketCount; use serde::{Deserialize, Serialize}; @@ -268,26 +268,6 @@ impl<'ir> Instruction<'ir> { } } -/// Some part referred to in source code. -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct Span { - // would love to use an actual [`std::ops::RangeInclusive`], but those don't implement - // `PartialOrd` and `Ord` unfortunately - /// At which byte this span starts, inclusively. - pub from: usize, - /// At which byte this span ends, inclusively. - pub to: usize, -} - -impl From> for Span { - fn from(range: RangeInclusive) -> Self { - Self { - from: *range.start(), - to: *range.end(), - } - } -} - /// Constructs an [`id::Socket`] a bit more tersely. fn socket(id: &id::Instruction, idx: u16) -> id::Socket { id::Socket { diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs index 64dae43..7d7ff83 100644 --- a/crates/ir/src/semi_human.rs +++ b/crates/ir/src/semi_human.rs @@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize}; -use crate::{id, instruction, Map, Set, Span}; +use crate::{id, instruction, Map, Set}; /// Semi-human-{read,writ}able [`crate::GraphIr`] with far less useful types. /// @@ -19,8 +19,7 @@ use crate::{id, instruction, Map, Set, Span}; #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct GraphIr { /// See [`crate::GraphIr::instructions`], just that a simple number is used for the ID instead - /// of a proper span. - pub(crate) instructions: Map, + pub(crate) instructions: Map, /// See [`crate::GraphIr::edges`], the forward edges. /// RON wants you to type the set as if it were a list. pub(crate) edges: Map>, @@ -29,17 +28,14 @@ pub struct GraphIr { #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Deserialize, Serialize)] pub struct Socket { /// ID of the instruction this socket is on. - pub(crate) on: usize, + pub(crate) on: u64, pub(crate) idx: u16, } impl From for id::Socket { fn from(source: Socket) -> Self { Self { - belongs_to: (id::Instruction(Span { - from: source.on, - to: source.on, - })), + belongs_to: id::Instruction(source.on), idx: id::SocketIdx(source.idx), } } @@ -52,7 +48,7 @@ impl From for crate::GraphIr { instructions: source .instructions .into_iter() - .map(|(id, kind)| (id::Instruction(Span { from: id, to: id }), kind)) + .map(|(id, kind)| (id::Instruction(id), kind)) .collect(), edges: type_edges(source.edges), rev_edges: reverse_and_type_edges(edges), From 8b6f9810df0150019bfe68b352136aa047305e26 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Fri, 19 Jan 2024 14:34:00 +0100 Subject: [PATCH 067/189] docs(ir): clarify localness of socketidx --- crates/ir/src/id.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs index a55806e..3b3f919 100644 --- a/crates/ir/src/id.rs +++ b/crates/ir/src/id.rs @@ -58,6 +58,13 @@ pub struct Socket { pub idx: SocketIdx, } -/// Where a [`Socket`] is on an **instruction**. +/// Where a [`Socket`] is on one **instruction**. +/// +/// Note that this does **not** identify a [`Socket`] globally. +/// There may be multiple [`Socket`]s sharing the same [`SocketIdx`], +/// but on different [`Instruction`]s. +/// +/// This really only serves for denoting where a socket is, +/// when it's already clear which instruction is referred to. #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct SocketIdx(pub u16); From 98c9399ee47981fc412eeac2fcd773e3d1d9def5 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 17:59:21 +0100 Subject: [PATCH 068/189] feat: nicer debug repr for instr id and socketidx --- crates/ir/src/id.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs index 3b3f919..8f456a8 100644 --- a/crates/ir/src/id.rs +++ b/crates/ir/src/id.rs @@ -15,15 +15,23 @@ //! The distinction between [`Input`] and [`Output`] is implemented //! as them being different types. +use std::fmt; + use serde::{Deserialize, Serialize}; /// One specific instruction. /// /// It does **not** contain what kind of instruction this is. /// Refer to [`crate::instruction::Kind`] for this instead. -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Instruction(pub(super) u64); +impl fmt::Debug for Instruction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "InstrId {}", self.0) + } +} + /// On an **instruction**, accepts incoming data. /// /// An **instruction** cannot run if any of these are not connected. @@ -66,5 +74,11 @@ pub struct Socket { /// /// This really only serves for denoting where a socket is, /// when it's already clear which instruction is referred to. -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct SocketIdx(pub u16); + +impl fmt::Debug for SocketIdx { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} From 23fadce867ecf39cda456f519a73499a4a92eef1 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 21:32:25 +0100 Subject: [PATCH 069/189] fix: glue with app from #7 --- Cargo.lock | 82 ++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 3 +- crates/app/Cargo.toml | 3 ++ 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e191631..1f7a514 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -171,15 +171,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" -[[package]] -name = "cli" -version = "0.1.0" -dependencies = [ - "clap", - "executor", - "ir", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -327,6 +318,17 @@ dependencies = [ "spin", ] +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gif" version = "0.12.0" @@ -380,6 +382,12 @@ dependencies = [ "serde", ] +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + [[package]] name = "jpeg-decoder" version = "0.3.0" @@ -395,6 +403,23 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "lock_api" version = "0.4.11" @@ -445,6 +470,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "owo-colors" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" + [[package]] name = "png" version = "0.17.10" @@ -543,6 +589,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + [[package]] name = "scopeguard" version = "1.2.0" @@ -687,6 +739,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "weezl" version = "0.1.7" @@ -825,6 +883,12 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/Cargo.toml b/Cargo.toml index f4aa395..7e5ee39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,14 @@ [workspace] members = [ + "crates/app", "crates/executor", "crates/ir", - "crates/cli", ] resolver = "2" [workspace.dependencies] clap = { version = "4", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } # to enable all the lints below, this must be present in a workspace member's Cargo.toml: # [lints] diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index a0043ee..92315cf 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -14,3 +14,6 @@ ariadne = "0.4" time = { version = "0.3", features = [ "local-offset" ] } dirs = "5" owo-colors = "4" + +[lints] +workspace = true From c4207af8da25aad70529f14caec5bc0af64e2e6c Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 21:36:40 +0100 Subject: [PATCH 070/189] repo: rename executor -> eval --- Cargo.lock | 2 +- Cargo.toml | 2 +- crates/{executor => eval}/Cargo.toml | 2 +- crates/{executor => eval}/src/cpu/mod.rs | 0 crates/{executor => eval}/src/debug/instructions/mod.rs | 0 crates/{executor => eval}/src/debug/mod.rs | 0 crates/{executor => eval}/src/lib.rs | 0 crates/{executor => eval}/src/value/mod.rs | 0 8 files changed, 3 insertions(+), 3 deletions(-) rename crates/{executor => eval}/Cargo.toml (93%) rename crates/{executor => eval}/src/cpu/mod.rs (100%) rename crates/{executor => eval}/src/debug/instructions/mod.rs (100%) rename crates/{executor => eval}/src/debug/mod.rs (100%) rename crates/{executor => eval}/src/lib.rs (100%) rename crates/{executor => eval}/src/value/mod.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 1f7a514..43e560a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -266,7 +266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] -name = "executor" +name = "eval" version = "0.1.0" dependencies = [ "clap", diff --git a/Cargo.toml b/Cargo.toml index 7e5ee39..6d7f53d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] members = [ "crates/app", - "crates/executor", + "crates/eval", "crates/ir", ] resolver = "2" diff --git a/crates/executor/Cargo.toml b/crates/eval/Cargo.toml similarity index 93% rename from crates/executor/Cargo.toml rename to crates/eval/Cargo.toml index 711b9b9..1889f32 100644 --- a/crates/executor/Cargo.toml +++ b/crates/eval/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "executor" +name = "eval" version = "0.1.0" edition = "2021" diff --git a/crates/executor/src/cpu/mod.rs b/crates/eval/src/cpu/mod.rs similarity index 100% rename from crates/executor/src/cpu/mod.rs rename to crates/eval/src/cpu/mod.rs diff --git a/crates/executor/src/debug/instructions/mod.rs b/crates/eval/src/debug/instructions/mod.rs similarity index 100% rename from crates/executor/src/debug/instructions/mod.rs rename to crates/eval/src/debug/instructions/mod.rs diff --git a/crates/executor/src/debug/mod.rs b/crates/eval/src/debug/mod.rs similarity index 100% rename from crates/executor/src/debug/mod.rs rename to crates/eval/src/debug/mod.rs diff --git a/crates/executor/src/lib.rs b/crates/eval/src/lib.rs similarity index 100% rename from crates/executor/src/lib.rs rename to crates/eval/src/lib.rs diff --git a/crates/executor/src/value/mod.rs b/crates/eval/src/value/mod.rs similarity index 100% rename from crates/executor/src/value/mod.rs rename to crates/eval/src/value/mod.rs From de9ca81b652dad9799547be319890286681cb084 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sat, 20 Jan 2024 21:47:33 +0100 Subject: [PATCH 071/189] chore: appease clippy --- crates/app/src/config/config_file.rs | 7 +++++-- crates/app/src/error_reporting.rs | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index a0c4db1..a8ba835 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -40,10 +40,13 @@ pub(super) fn find_config_file() -> Result { impl Configs { pub fn read(p: PathBuf) -> Result { - match p.extension().map(|v| v.to_str().unwrap()) { + match p + .extension() + .map(|v| v.to_str().expect("config path to be UTF-8")) + { Some("ron") => Ok(serde_json::from_str(&fs::read_to_string(p)?)?), Some("json") => Ok(ron::from_str(&fs::read_to_string(p)?)?), - e => Err(ConfigError::UnknownExtension(e.map(|v| v.to_owned()))), + e => Err(ConfigError::UnknownExtension(e.map(str::to_string))), } } } diff --git a/crates/app/src/error_reporting.rs b/crates/app/src/error_reporting.rs index 33ffff6..bc4c44b 100644 --- a/crates/app/src/error_reporting.rs +++ b/crates/app/src/error_reporting.rs @@ -3,12 +3,12 @@ use std::process; use ron::error::Position; /// Report an `Error` from the `serde_json` crate -pub fn report_serde_json_err(src: &str, err: serde_json::Error) -> ! { +pub fn report_serde_json_err(src: &str, err: &serde_json::Error) -> ! { report_serde_err(src, err.line(), err.column(), err.to_string()) } /// Report a `SpannedError` from the `ron` crate -pub fn report_serde_ron_err(src: &str, err: ron::error::SpannedError) -> ! { +pub fn report_serde_ron_err(src: &str, err: &ron::error::SpannedError) -> ! { let Position { line, col } = err.position; report_serde_err(src, line, col, err.to_string()) } @@ -23,8 +23,8 @@ fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { .with_message(msg) .with_note("We'd like to give better errors, but serde errors are horrible to work with...") .finish() - .print(("test", Source::from(src))) - .unwrap(); + .eprint(("test", Source::from(src))) + .expect("writing error to stderr failed"); process::exit(1); } From 3c529c3a1a8e5dd26dedf0052c0f4d8da8597b9e Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 03:22:46 +0100 Subject: [PATCH 072/189] chore: rename executor -> evaluator and integrate into app --- Cargo.lock | 3 + crates/app/Cargo.toml | 12 +-- crates/app/src/config.rs | 43 +++++----- crates/app/src/config/cli.rs | 8 ++ crates/app/src/config/config_file.rs | 13 +-- crates/app/src/main.rs | 12 +++ crates/eval/Cargo.toml | 1 + crates/eval/src/cpu/mod.rs | 1 - crates/eval/src/debug/mod.rs | 37 --------- .../instructions => kind/debug/instr}/mod.rs | 0 crates/eval/src/kind/debug/mod.rs | 57 +++++++++++++ crates/eval/src/kind/mod.rs | 1 + crates/eval/src/lib.rs | 61 ++++++++------ crates/ir/src/lib.rs | 83 +++++++++++++++---- docs/design/iowo-design.typ | 10 +-- docs/template.typ | 2 +- 16 files changed, 229 insertions(+), 115 deletions(-) delete mode 100644 crates/eval/src/cpu/mod.rs delete mode 100644 crates/eval/src/debug/mod.rs rename crates/eval/src/{debug/instructions => kind/debug/instr}/mod.rs (100%) create mode 100644 crates/eval/src/kind/debug/mod.rs create mode 100644 crates/eval/src/kind/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 43e560a..7447d0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -63,6 +63,8 @@ dependencies = [ "ariadne", "clap", "dirs", + "eval", + "ir", "owo-colors", "ron", "serde", @@ -272,6 +274,7 @@ dependencies = [ "clap", "image", "ir", + "serde", ] [[package]] diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 92315cf..2caaaf4 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -6,14 +6,16 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { workspace = true, features = [ "derive", "env" ] } -serde = { workspace = true, features = [ "derive" ] } -ron = "0.8" -serde_json = "1.0" ariadne = "0.4" -time = { version = "0.3", features = [ "local-offset" ] } +clap = { workspace = true, features = [ "derive", "env" ] } dirs = "5" +eval = { path = "../eval" } +ir = { path = "../ir" } owo-colors = "4" +ron = "0.8" +serde = { workspace = true, features = [ "derive" ] } +serde_json = "1.0" +time = { version = "0.3", features = [ "local-offset" ] } [lints] workspace = true diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index 9f2b15a..b4d1ed1 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use clap::Parser; use self::{ @@ -10,6 +12,9 @@ mod config_file; /// this struct may hold all configuration pub struct Config { + pub source: PathBuf, + pub evaluator: eval::Available, + pub startup_msg: bool, } @@ -17,37 +22,37 @@ impl Config { /// Get the configs from all possible places (args, file, env...) pub fn read() -> Self { let args = Args::parse(); - let config_path = if let Some(config_path) = args.config_path { - Ok(config_path) + let config = if let Some(config) = args.config_path { + Ok(config) } else { find_config_file() }; // try to read a maybe existing config file - let file_config = if let Ok(config_path) = config_path { - let file_config = Configs::read(config_path); - - match file_config { - Ok(c) => Some(c), - Err(e) => { + let config = config.ok().and_then(|path| { + Configs::read(path).map_or_else( + |e| { eprintln!("Config error: {e:?}"); eprintln!("Proceeding with defaults or cli args..."); None - } - } - } else { - None - }; + }, + Some, + ) + }); - if let Some(file_config) = file_config { + if let Some(file) = config { Self { + source: args.source, + evaluator: args.evaluator.and(file.evaluator).unwrap_or_default(), // this is negated because to an outward api, the negative is more intuitive, // while in the source the other way around is more intuitive - startup_msg: !(args.no_startup_message || file_config.no_startup_message), + startup_msg: !(args.no_startup_message || file.no_startup_message), } } else { Self { + source: args.source, startup_msg: !args.no_startup_message, + evaluator: args.evaluator.unwrap_or_default(), } } } @@ -56,7 +61,7 @@ impl Config { pub mod error { /// Errors that can occur when reading configs #[derive(Debug)] - pub enum ConfigError { + pub enum Config { /// The config dir doesn't exist NoConfigDir, /// We didn't find a config file in the config dir @@ -73,19 +78,19 @@ pub mod error { SerdeRonError(ron::error::SpannedError), } - impl From for ConfigError { + impl From for Config { fn from(value: std::io::Error) -> Self { Self::IoError(value) } } - impl From for ConfigError { + impl From for Config { fn from(value: serde_json::Error) -> Self { Self::SerdeJsonError(value) } } - impl From for ConfigError { + impl From for Config { fn from(value: ron::error::SpannedError) -> Self { Self::SerdeRonError(value) } diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index bdf769e..1d9c57a 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -4,6 +4,14 @@ use clap::{builder::BoolishValueParser, ArgAction, Parser}; #[derive(Parser)] pub(crate) struct Args { + /// What file contains the pipeline to evaluate. + pub source: PathBuf, + + /// How to actually run the pipeline. + /// Overrides the config file. Defaults to the debug evaluator. + #[arg(short, long)] + pub evaluator: Option, + /// Read this config file. #[arg(short, long)] pub config_path: Option, diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index a8ba835..aaf92d1 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -5,7 +5,7 @@ use std::{ use serde::{Deserialize, Serialize}; -use super::error::ConfigError; +use super::error::Config; #[derive(Debug, Serialize, Deserialize)] pub struct Configs { @@ -13,6 +13,7 @@ pub struct Configs { pub example_value: i32, #[serde(default)] pub no_startup_message: bool, + pub evaluator: Option, } /// what the fuck serde why do i need this @@ -21,9 +22,9 @@ fn default_example_value() -> i32 { } /// Find the location of a config file and check if there is, in fact, a file -pub(super) fn find_config_file() -> Result { +pub(super) fn find_config_file() -> Result { let Some(config_path) = dirs::config_dir() else { - return Err(ConfigError::NoConfigDir); + return Err(Config::NoConfigDir); }; let ron_path = config_path.with_file_name("config.ron"); @@ -34,19 +35,19 @@ pub(super) fn find_config_file() -> Result { } else if Path::new(&json_path).exists() { Ok(json_path) } else { - Err(ConfigError::NoConfigFileFound) + Err(Config::NoConfigFileFound) } } impl Configs { - pub fn read(p: PathBuf) -> Result { + pub fn read(p: PathBuf) -> Result { match p .extension() .map(|v| v.to_str().expect("config path to be UTF-8")) { Some("ron") => Ok(serde_json::from_str(&fs::read_to_string(p)?)?), Some("json") => Ok(ron::from_str(&fs::read_to_string(p)?)?), - e => Err(ConfigError::UnknownExtension(e.map(str::to_string))), + e => Err(Config::UnknownExtension(e.map(str::to_string))), } } } diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 1347572..c523594 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,3 +1,5 @@ +use std::fs; + use config::Config; use welcome_msg::print_startup_msg; @@ -14,4 +16,14 @@ fn main() { if cfg.startup_msg { print_startup_msg(); } + + let source = + fs::read_to_string(cfg.source).expect("can't find source file lol handle me better please"); + + let ir = + ir::from_ron(&source).expect("aww failed to parse source to graph ir handle me better"); + + let mut machine = cfg.evaluator.pick(); + machine.feed(ir); + machine.eval_full(); } diff --git a/crates/eval/Cargo.toml b/crates/eval/Cargo.toml index 1889f32..b542d2f 100644 --- a/crates/eval/Cargo.toml +++ b/crates/eval/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" clap = { workspace = true, features = [ "derive" ] } image = "0.24" ir = { path = "../ir" } +serde = { workspace = true } [lints] workspace = true diff --git a/crates/eval/src/cpu/mod.rs b/crates/eval/src/cpu/mod.rs deleted file mode 100644 index e82d20a..0000000 --- a/crates/eval/src/cpu/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) struct CpuExecutor; diff --git a/crates/eval/src/debug/mod.rs b/crates/eval/src/debug/mod.rs deleted file mode 100644 index b9cd743..0000000 --- a/crates/eval/src/debug/mod.rs +++ /dev/null @@ -1,37 +0,0 @@ -use ir::instruction::{Filter, Kind}; - -use crate::value::Dynamic; -mod instructions; - -pub struct Executor; - -impl crate::Executor for Executor { - fn execute(instruction: Kind, input: Option) -> Option { - match instruction { - Kind::Read(read_instruction) => { - Some(Dynamic::Image(instructions::read::read(read_instruction))) - } - Kind::Write(write_instruction) => { - instructions::write::write( - write_instruction, - match input { - Some(Dynamic::Image(ref img)) => img, - _ => panic!("awawwawwa"), - }, - ); - None - } - Kind::Math(_) => todo!(), - Kind::Blend(_) => todo!(), - Kind::Noise(_) => todo!(), - Kind::Filter(filter_instruction) => match filter_instruction { - Filter::Invert => Some(Dynamic::Image(instructions::filters::invert::invert( - match input { - Some(Dynamic::Image(img)) => img, - _ => panic!("invalid value type for invert"), - }, - ))), - }, - } - } -} diff --git a/crates/eval/src/debug/instructions/mod.rs b/crates/eval/src/kind/debug/instr/mod.rs similarity index 100% rename from crates/eval/src/debug/instructions/mod.rs rename to crates/eval/src/kind/debug/instr/mod.rs diff --git a/crates/eval/src/kind/debug/mod.rs b/crates/eval/src/kind/debug/mod.rs new file mode 100644 index 0000000..55c4fbb --- /dev/null +++ b/crates/eval/src/kind/debug/mod.rs @@ -0,0 +1,57 @@ +use std::mem; + +use ir::{ + instruction::{Filter, Kind}, + GraphIr, Instruction, InstructionRef, +}; + +use crate::value::Dynamic; +mod instr; + +#[derive(Debug, Default)] +pub struct Evaluator { + ir: GraphIr, +} + +impl crate::Evaluator for Evaluator { + fn feed(&mut self, ir: GraphIr) { + // TODO: should add instead of replace, see note in Evaluator trait above this method + self.ir = ir; + } + + fn eval_full(&mut self) { + let queue: Vec = self + .ir + .topological_sort() + .into_iter() + .map(Into::into) + .collect(); + for instr in queue { + self.step(instr); + } + } +} + +impl Evaluator { + #[allow(clippy::needless_pass_by_value)] + fn step(&mut self, instr: Instruction) { + let _ = match instr.kind { + Kind::Read(details) => Some(Dynamic::Image(instr::read::read(details))), + Kind::Write(details) => { + instr::write::write(details, todo!()); + None + } + Kind::Math(_) => todo!(), + Kind::Blend(_) => todo!(), + Kind::Noise(_) => todo!(), + Kind::Filter(filter_instruction) => match filter_instruction { + Filter::Invert => Some(Dynamic::Image(instr::filters::invert::invert( + match todo!() { + Some(Dynamic::Image(img)) => img, + _ => panic!("invalid value type for invert"), + }, + ))), + }, + }; + } +} diff --git a/crates/eval/src/kind/mod.rs b/crates/eval/src/kind/mod.rs new file mode 100644 index 0000000..2f36523 --- /dev/null +++ b/crates/eval/src/kind/mod.rs @@ -0,0 +1 @@ +pub mod debug; diff --git a/crates/eval/src/lib.rs b/crates/eval/src/lib.rs index 9732bb0..c3a6c38 100644 --- a/crates/eval/src/lib.rs +++ b/crates/eval/src/lib.rs @@ -1,34 +1,43 @@ -use ir::instruction::Kind; -use value::Dynamic; +use ir::GraphIr; -mod debug; +mod kind; mod value; -/// The available executors -/// unused in early dev. -#[derive(Debug, Clone, Copy, clap::ValueEnum)] -pub enum RegisteredExecutor { - /// the debug executor is single threaded and really, *really* slow. And unstable. Don't use. Unless you're a dev working on this. +/// Can collapse a [`GraphIr`] in meaningful ways and do interesting work on it. +/// +/// It's surprisingly difficult to find a fitting description for this. +pub trait Evaluator { + /// Take some [`GraphIr`] which will then be processed later. + /// May be called multiple times, in which the [`GraphIr`]s should add up. + // TODO: atm they definitely don't add up -- add some functionality to GraphIr to + // make it combine two graphs into one + fn feed(&mut self, ir: GraphIr); + + /// Walk through the _whole_ [`GraphIr`] and run through each instruction. + fn eval_full(&mut self); + + // TODO: for an LSP or the like, eval_single which starts at a given instr +} + +/// The available [`Evaluator`]s. +/// +/// Checklist for adding new ones: +/// +/// 1. Create a new module under the [`kind`] module. +/// 2. Add a struct and implement [`Evaluator`] for it. +#[derive(Clone, Copy, Debug, Default, clap::ValueEnum, serde::Deserialize, serde::Serialize)] +pub enum Available { + /// Runs fully on the CPU. Single-threaded, debug-friendly and quick to implement. + #[default] Debug, } -trait Executor { - fn execute(instruction: Kind, input: Option) -> Option; -} - -pub fn execute_all(instructions: Vec) { - let mut tmp = None; - - for instruction in instructions { - tmp = debug::Executor::execute(instruction, tmp); +impl Available { + /// Selects the [`Evaluator`] corresponding to this label. + #[must_use] + pub fn pick(&self) -> Box { + match self { + Self::Debug => Box::new(kind::debug::Evaluator::default()), + } } } - -// scratchpad lol: -// execution structure: -// 1. take in rpl -// 2. analyse/validate structure against allowed executors -// 3. assign executors to instructions -// 4. optimize -// 5. prepare memory management patterns -// 6. run diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index ef7a23d..68aca01 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -56,7 +56,7 @@ pub fn from_ron(source: &str) -> ron::error::SpannedResult { /// So the vertices of the DAG are the **sockets** /// (which are either [`id::Input`] or [`id::Output`] depending on the direction), /// and each **socket** in turn belongs to an **instruction**. -#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)] pub struct GraphIr { /// "Backbone" storage of all **instruction** IDs to /// what **kind of instruction** they are. @@ -123,13 +123,13 @@ impl GraphIr { /// to actually have multiple [`GraphIr`]s at one point in time. /// Open an issue if that poses a problem for you. #[must_use] - pub fn resolve<'ir>(&'ir self, subject: &id::Instruction) -> Option> { + pub fn resolve<'ir>(&'ir self, subject: &id::Instruction) -> Option> { let (id, kind) = self.instructions.get_key_value(subject)?; let input_sources = self.input_sources(subject)?.collect(); let output_targets = self.output_targets(subject)?.collect(); - Some(Instruction { + Some(InstructionRef { id, kind, input_sources, @@ -141,7 +141,7 @@ impl GraphIr { /// /// The same caveats as for [`GraphIr::resolve`] apply. #[must_use] - pub fn owner_of_input<'ir>(&'ir self, input: &id::Input) -> Option> { + pub fn owner_of_input<'ir>(&'ir self, input: &id::Input) -> Option> { self.resolve(&input.socket().belongs_to) } @@ -149,7 +149,7 @@ impl GraphIr { /// /// The same caveats as for [`GraphIr::resolve`] apply. #[must_use] - pub fn owner_of_output<'ir>(&'ir self, output: &id::Output) -> Option> { + pub fn owner_of_output<'ir>(&'ir self, output: &id::Output) -> Option> { self.resolve(&output.socket().belongs_to) } @@ -163,7 +163,7 @@ impl GraphIr { #[must_use] // yes, this function could probably return an iterator and be lazy // no, not today - pub fn topological_sort(&self) -> Vec { + pub fn topological_sort(&self) -> Vec { // count how many incoming edges each vertex has let mut nonzero_input_counts: Map<_, NonZeroUsize> = self.rev_edges @@ -240,18 +240,58 @@ impl GraphIr { } } -/// A full instruction in context, with its inputs and outputs. +/// Constructs an [`id::Socket`] a bit more tersely. +fn socket(id: &id::Instruction, idx: u16) -> id::Socket { + id::Socket { + belongs_to: id.clone(), + idx: id::SocketIdx(idx), + } +} + +/// A full instruction bundeled in context, with its inputs and outputs. #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -pub struct Instruction<'ir> { +pub struct Instruction { + pub id: id::Instruction, + pub kind: instruction::Kind, + + // can't have these two public since then a user might corrupt their length + input_sources: Vec>, + output_targets: Vec>, +} + +impl Instruction { + /// Where this instruction gets its inputs from. + /// + /// [`None`] means that this input is unfilled, + /// and must be filled before the instruction can be ran. + #[must_use] + pub fn input_sources(&self) -> &[Option] { + &self.input_sources + } + + /// To whom outputs are sent. + #[must_use] + pub fn output_targets(&self) -> &[Set] { + &self.output_targets + } +} + +/// [`Instruction`], but every single field is borrowed instead. +/// See its docs. +/// +/// Use the [`From`] impl to handily convert into an [`Instruction`]. +/// The other way around is unlikely to be wanted — since you already have an [`Instruction`], +/// chances are you just want to take a reference (`&`) of it. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct InstructionRef<'ir> { pub id: &'ir id::Instruction, pub kind: &'ir instruction::Kind, - // can't have these two public since then a user might corrupt their length input_sources: Vec>, output_targets: Vec>>, } -impl<'ir> Instruction<'ir> { +impl<'ir> InstructionRef<'ir> { /// Where this instruction gets its inputs from. /// /// [`None`] means that this input is unfilled, @@ -268,10 +308,23 @@ impl<'ir> Instruction<'ir> { } } -/// Constructs an [`id::Socket`] a bit more tersely. -fn socket(id: &id::Instruction, idx: u16) -> id::Socket { - id::Socket { - belongs_to: id.clone(), - idx: id::SocketIdx(idx), +// would love to use ToOwned but Rust has no specialization yet +// and it'd hurt a blanket impl of ToOwned otherwise +impl From> for Instruction { + fn from(source: InstructionRef<'_>) -> Self { + Self { + id: source.id.clone(), + kind: source.kind.clone(), + input_sources: source + .input_sources + .into_iter() + .map(Option::<&_>::cloned) + .collect(), + output_targets: source + .output_targets + .into_iter() + .map(|outputs| outputs.map(Clone::clone).unwrap_or_default()) + .collect(), + } } } diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index aa9f9f2..c05db3c 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -7,7 +7,7 @@ subtitle: [don't worry, we're just dreaming], ) -= Evaluation stages += Processing stages #graphics.stages-overview @@ -18,7 +18,7 @@ This has a number of benefits and implications: - Bugs are easier to trace down to one stage. - Stages are also replacable, pluggable and usable somewhere else. - For example, - one could write a Just-In-Time compiler as a new executor to replace the runtime stage, + one could write a Just-In-Time compiler as a new evaluator to replace the runtime stage, while preserving the source #arrow() graph IR step. However, this also makes the architecture somewhat more complicated. So here we try our best to describe how each stage looks like. If you have any feedback, feel free to drop it on #link("https://forge.katzen.cafe/katzen-cafe/iowo/issues")[the issues in the repository]! @@ -155,12 +155,12 @@ Runs through all functions in the graph IR. It does not have any significantly other representation, and despite its name there's _no_ bytecode involved. -Different runtimes are called executors. -Executors operate on instructions instead of functions. +Different runtimes are called evaluators. +Evaluators operate on instructions instead of functions. === Scheduler -Looks at the graph IR and decides when the VM should execute what. +Looks at the graph IR and decides when the VM should evaluate what. === VM diff --git a/docs/template.typ b/docs/template.typ index a624cc7..0402015 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -37,7 +37,7 @@ "AST", "graph IR", "runtime", - "executor", + "evaluator", "optimizer", "scheduler", From 3e208335c36b2b78d379dac4d2d271f11a29fecc Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 04:21:33 +0100 Subject: [PATCH 073/189] feat: get full evaluation back online Very hacky, but this is enough to be finished with the graph IR for now. --- .gitignore | 2 + crates/eval/src/kind/debug/mod.rs | 75 +++++++++++++++++++++++++------ crates/eval/src/value/mod.rs | 9 +++- crates/ir/src/id.rs | 4 +- crates/ir/src/lib.rs | 23 ++++++++++ crates/ir/src/value/mod.rs | 3 -- testfiles/bare.ron | 8 ++-- testfiles/gen/.gitkeep | 1 + testfiles/invert.ron | 6 +-- 9 files changed, 105 insertions(+), 26 deletions(-) delete mode 100644 crates/ir/src/value/mod.rs create mode 100644 testfiles/gen/.gitkeep diff --git a/.gitignore b/.gitignore index 49067bd..bca6aa2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ .pre-commit-config.yaml *.pdf /docs/*.png +/testfiles/gen/* +!/testfiles/gen/.gitkeep diff --git a/crates/eval/src/kind/debug/mod.rs b/crates/eval/src/kind/debug/mod.rs index 55c4fbb..1f46c49 100644 --- a/crates/eval/src/kind/debug/mod.rs +++ b/crates/eval/src/kind/debug/mod.rs @@ -1,31 +1,39 @@ -use std::mem; - use ir::{ + id, instruction::{Filter, Kind}, - GraphIr, Instruction, InstructionRef, + GraphIr, Instruction, Map, }; -use crate::value::Dynamic; +use crate::value::Variant; mod instr; #[derive(Debug, Default)] pub struct Evaluator { ir: GraphIr, + + /// What the output of each individual streamer, and as result its output sockets, is. + /// Grows larger as evaluation continues, + /// as there's no mechanism for purging never-to-be-used-anymore instructions yet. + evaluated: Map, } impl crate::Evaluator for Evaluator { fn feed(&mut self, ir: GraphIr) { // TODO: should add instead of replace, see note in Evaluator trait above this method self.ir = ir; + self.evaluated.clear(); } fn eval_full(&mut self) { + // GraphIr::topological_sort returns InstructionRefs, which are mostly cool + // but we'd like to have them owned, so we can call Self::step without lifetime hassle let queue: Vec = self .ir .topological_sort() .into_iter() .map(Into::into) .collect(); + for instr in queue { self.step(instr); } @@ -35,23 +43,64 @@ impl crate::Evaluator for Evaluator { impl Evaluator { #[allow(clippy::needless_pass_by_value)] fn step(&mut self, instr: Instruction) { - let _ = match instr.kind { - Kind::Read(details) => Some(Dynamic::Image(instr::read::read(details))), + // what inputs does this instr need? fetch them + let inputs: Vec<_> = instr + .input_sources() + .iter() + .map(|source| { + let source_socket = source + .as_ref() + .expect("all inputs to be connected when an instruction is ran"); + self.evaluated + .get(source_socket) + .expect("toposort to yield later instrs only after previous ones") + }) + .collect(); + + // then actually do whatever the instruction should do + // NOTE: makes heavy use of index slicing, + // on the basis that ir::instruction::Kind::socket_count is correct + // TODO: make this a more flexible dispatch-ish arch + let output = match instr.kind { + Kind::Read(details) => Some(Variant::Image(instr::read::read(details))), Kind::Write(details) => { - instr::write::write(details, todo!()); + #[allow(irrefutable_let_patterns)] // will necessarily change + let Variant::Image(input) = inputs[0] else { + panic!("cannot only write images, but received: `{:?}`", inputs[0]); + }; + instr::write::write(details, input); None } Kind::Math(_) => todo!(), Kind::Blend(_) => todo!(), Kind::Noise(_) => todo!(), Kind::Filter(filter_instruction) => match filter_instruction { - Filter::Invert => Some(Dynamic::Image(instr::filters::invert::invert( - match todo!() { - Some(Dynamic::Image(img)) => img, - _ => panic!("invalid value type for invert"), - }, - ))), + Filter::Invert => { + #[allow(irrefutable_let_patterns)] + let Variant::Image(input) = inputs[0] else { + panic!( + "cannot only filter invert images, but received: `{:?}`", + inputs[0] + ); + }; + + Some(Variant::Image(instr::filters::invert::invert( + input.clone(), + ))) + } }, }; + + if let Some(output) = output { + // TODO: very inaccurate, actually respect individual instructions. + // should be implied by a different arch + // TODO: all of those should not be public, offer some methods to get this on + // `Instruction` instead (can infer short-term based on Kind::socket_count) + let socket = id::Output(id::Socket { + belongs_to: instr.id, + idx: id::SocketIdx(0), + }); + self.evaluated.insert(socket, output); + } } } diff --git a/crates/eval/src/value/mod.rs b/crates/eval/src/value/mod.rs index f3595d0..b1d85d5 100644 --- a/crates/eval/src/value/mod.rs +++ b/crates/eval/src/value/mod.rs @@ -1,5 +1,12 @@ use image::DynamicImage; -pub enum Dynamic { +/// Any runtime value that an instruction can input or output. +/// +/// The name is taken from [Godot's `Variant` type], +/// which is very similar to this one. +/// +/// [Godot's `Variant` type]: https://docs.godotengine.org/en/stable/classes/class_variant.html +#[derive(Clone, Debug)] +pub enum Variant { Image(DynamicImage), } diff --git a/crates/ir/src/id.rs b/crates/ir/src/id.rs index 8f456a8..4834a4f 100644 --- a/crates/ir/src/id.rs +++ b/crates/ir/src/id.rs @@ -49,7 +49,7 @@ impl Input { /// /// In contrast to [`Input`]s, [`Output`]s may be used or unused. #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct Output(pub(super) Socket); +pub struct Output(pub Socket); // TODO: Restrict publicness to super impl Output { #[must_use] @@ -75,7 +75,7 @@ pub struct Socket { /// This really only serves for denoting where a socket is, /// when it's already clear which instruction is referred to. #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub struct SocketIdx(pub u16); +pub struct SocketIdx(pub u16); // TODO: Restrict publicness to super impl fmt::Debug for SocketIdx { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { diff --git a/crates/ir/src/lib.rs b/crates/ir/src/lib.rs index 68aca01..702244c 100644 --- a/crates/ir/src/lib.rs +++ b/crates/ir/src/lib.rs @@ -27,6 +27,8 @@ pub fn from_ron(source: &str) -> ron::error::SpannedResult { /// The toplevel representation of a whole pipeline. /// +/// # DAGs +/// /// Pipelines may not be fully linear. They may branch out and recombine later on. /// As such, the representation for them which is currently used is a /// [**D**irected **A**cyclic **G**raph](https://en.wikipedia.org/wiki/Directed_acyclic_graph). @@ -56,6 +58,27 @@ pub fn from_ron(source: &str) -> ron::error::SpannedResult { /// So the vertices of the DAG are the **sockets** /// (which are either [`id::Input`] or [`id::Output`] depending on the direction), /// and each **socket** in turn belongs to an **instruction**. +/// +/// # Usage +/// +/// - If you want to build one from scratch, +/// add a few helper methods like +/// constructing an empty one, +/// adding instructions and +/// adding edges +/// - If you want to construct one from an existing repr, +/// maybe you want to use [`semi_human::GraphIr`]. +/// +/// # Storing additional data +/// +/// Chances are the graph IR seems somewhat fit to put metadata in it. +/// However, most likely you're interacting in context of some other system, +/// and also want to manage and index that data on your own. +/// +/// As such, consider using _secondary_ maps instead. +/// That is, store in a data structure _you_ own a mapping +/// from [`id`]s +/// to whatever data you need. #[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize, Serialize)] pub struct GraphIr { /// "Backbone" storage of all **instruction** IDs to diff --git a/crates/ir/src/value/mod.rs b/crates/ir/src/value/mod.rs deleted file mode 100644 index 238b9c2..0000000 --- a/crates/ir/src/value/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub enum DynamicValue { - Image(DynamicImage), -} diff --git a/testfiles/bare.ron b/testfiles/bare.ron index f2a9621..de78944 100644 --- a/testfiles/bare.ron +++ b/testfiles/bare.ron @@ -1,12 +1,12 @@ ( instructions: { 0: Read(( - source: File("testfiles/juan.jpg"), - format: Jpeg, + source: File("testfiles/rails.png"), + format: Png, )), 1: Write(( - target: File("testfiles/out.png"), - format: Png, + target: File("testfiles/gen/out.jpg"), + format: Jpeg, )), }, edges: { diff --git a/testfiles/gen/.gitkeep b/testfiles/gen/.gitkeep new file mode 100644 index 0000000..9daccef --- /dev/null +++ b/testfiles/gen/.gitkeep @@ -0,0 +1 @@ +the testfile scripts will place generated images and media here. thank you for your understanding. diff --git a/testfiles/invert.ron b/testfiles/invert.ron index 3f1f48c..ce8e68d 100644 --- a/testfiles/invert.ron +++ b/testfiles/invert.ron @@ -1,12 +1,12 @@ ( instructions: { 0: Read(( - source: File("testfiles/juan.jpg"), - format: Jpeg, + source: File("testfiles/rails.png"), + format: Png, )), 1: Filter(Invert), 2: Write(( - target: File("testfiles/inverted.png"), + target: File("testfiles/gen/inverted.png"), format: Png, )), }, From 1df57eba6b78f29222abb229c101bc04f522c51f Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 04:23:53 +0100 Subject: [PATCH 074/189] chore: remove accidental whitespace at end of line --- docs/design/type-notation.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/design/type-notation.typ b/docs/design/type-notation.typ index ee33517..ad991ee 100644 --- a/docs/design/type-notation.typ +++ b/docs/design/type-notation.typ @@ -34,5 +34,5 @@ One dimensional list of 32 bit signed integers: Due to inference, you'll also be able to use that in some mathematical operations with integers: -`[i32] + i32` is a valid operation, for example (of course, you can't add types.) But that wouldn't add the second one to the list, but rather add the single i32 to all values in the left hand side list). That would also work with more dimensional arrays and dynamic streams like videos. +`[i32] + i32` is a valid operation, for example (of course, you can't add types.) But that wouldn't add the second one to the list, but rather add the single i32 to all values in the left hand side list). That would also work with more dimensional arrays and dynamic streams like videos. From 98f4a6cdeba19ae6ce0d2a20c16104d1dbfc38de Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 21:00:36 +0100 Subject: [PATCH 075/189] chore: use to_owned instead of to_string --- crates/app/src/config/config_file.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index aaf92d1..15f660c 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -47,7 +47,7 @@ impl Configs { { Some("ron") => Ok(serde_json::from_str(&fs::read_to_string(p)?)?), Some("json") => Ok(ron::from_str(&fs::read_to_string(p)?)?), - e => Err(Config::UnknownExtension(e.map(str::to_string))), + e => Err(Config::UnknownExtension(e.map(str::to_owned))), } } } From bbde1c84ca5dc86f005680201f66256e07aae3b0 Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 21:08:27 +0100 Subject: [PATCH 076/189] chore: move error handling todos from msgs into comments --- crates/app/src/main.rs | 10 ++++------ crates/eval/src/kind/debug/instr/mod.rs | 3 ++- crates/ir/src/semi_human.rs | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index c523594..58103a5 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -10,18 +10,16 @@ mod error_reporting; mod welcome_msg; fn main() { - // TODO: proper error handling + // TODO: proper error handling across the whole function + // don't forget to also look inside `Config` let cfg = Config::read(); if cfg.startup_msg { print_startup_msg(); } - let source = - fs::read_to_string(cfg.source).expect("can't find source file lol handle me better please"); - - let ir = - ir::from_ron(&source).expect("aww failed to parse source to graph ir handle me better"); + let source = fs::read_to_string(cfg.source).expect("can't find source file"); + let ir = ir::from_ron(&source).expect("failed to parse source to graph ir"); let mut machine = cfg.evaluator.pick(); machine.feed(ir); diff --git a/crates/eval/src/kind/debug/instr/mod.rs b/crates/eval/src/kind/debug/instr/mod.rs index b78c7b5..14afac8 100644 --- a/crates/eval/src/kind/debug/instr/mod.rs +++ b/crates/eval/src/kind/debug/instr/mod.rs @@ -18,6 +18,7 @@ pub mod write { use ir::instruction::write::{TargetFormat, TargetType, Write}; pub fn write(Write { target, format }: Write, input_data: &DynamicImage) { + // TODO: actual error handling input_data .save_with_format( match target { @@ -28,7 +29,7 @@ pub mod write { TargetFormat::Png => ImageFormat::Png, }, ) - .expect("couldn't save file — come back later and handle me properly please uwu"); + .expect("couldn't save file"); } } diff --git a/crates/ir/src/semi_human.rs b/crates/ir/src/semi_human.rs index 7d7ff83..e8d3bdd 100644 --- a/crates/ir/src/semi_human.rs +++ b/crates/ir/src/semi_human.rs @@ -77,7 +77,8 @@ fn reverse_and_type_edges(edges: Map>) -> Map Date: Sun, 21 Jan 2024 21:28:35 +0100 Subject: [PATCH 077/189] chore: remove confusing comment --- crates/eval/src/kind/debug/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/eval/src/kind/debug/mod.rs b/crates/eval/src/kind/debug/mod.rs index 1f46c49..9b53ebe 100644 --- a/crates/eval/src/kind/debug/mod.rs +++ b/crates/eval/src/kind/debug/mod.rs @@ -19,7 +19,6 @@ pub struct Evaluator { impl crate::Evaluator for Evaluator { fn feed(&mut self, ir: GraphIr) { - // TODO: should add instead of replace, see note in Evaluator trait above this method self.ir = ir; self.evaluated.clear(); } From 10886be00ae79b3e4db31b6d66fa8ef29fb4a46c Mon Sep 17 00:00:00 2001 From: MultisampledNight Date: Sun, 21 Jan 2024 22:11:41 +0100 Subject: [PATCH 078/189] docs(design): add term list --- docs/design/iowo-design.typ | 80 ++++++++++++++++++++++++++++++++++--- docs/template.typ | 7 ++-- 2 files changed, 78 insertions(+), 9 deletions(-) diff --git a/docs/design/iowo-design.typ b/docs/design/iowo-design.typ index c05db3c..0645bee 100644 --- a/docs/design/iowo-design.typ +++ b/docs/design/iowo-design.typ @@ -7,6 +7,74 @@ subtitle: [don't worry, we're just dreaming], ) += Term overview + +/ Processing stages: + Whole workflow of iOwO, + from the source to evaluation. + +/ Source: + Nice textual representation of what iOwO is supposed to do. + Consists of instructions and pipelines. + +/ Graph IR: + Intermediate machine-readable representation of the source. + Can be modified by the optimizer + and is evaluated or "ran" by the runtime. + +/ Optimizer: + Simplifies the graph IR and makes it faster to run. + +/ Runtime: + All-encompassing term for what's done + after a graph IR is optimized and fully ready to go. + +/ Scheduler: + Looks at the graph IR + and decides which evaluator gets to run which part of it. + +/ Evaluator: + One specific implementation of how to run + through the whole graph IR to get its results. + +/ Function: + On the source level and before the graph IR, + anything that can be run with inputs, + possibly receiving outputs. + +/ Instruction: + Function, but in the graph IR and at runtime. + Ask schrottkatze on why the differentiation is important. + +/ Input: + Received by a function or instruction. + Different inputs may result in different behavior + and/or in different outputs. + +/ Argument: + On the source level, + an input which is given ad-hoc + instead of provided through a pipeline. + +/ Output: + Returned by a function or instruction, + and can be fed into other functions or instructions. + +/ Consumer: + Function or instruction that takes at least 1 input. + +/ Streamer: + Function or instruction that returns at least 1 output. + +/ Modifier: + Function or instruction that is _both_ a consumer and a streamer. + +/ Pipeline: + Any chain of streamers and consumers, + possibly with modifiers in-between, + that may branch out + and recombine arbitrarily. + = Processing stages #graphics.stages-overview @@ -152,17 +220,17 @@ Merges and simplifies functions in the graph IR. == Runtime Runs through all functions in the graph IR. -It does not have any significantly other representation, +It does not have any significantly different representation, and despite its name there's _no_ bytecode involved. -Different runtimes are called evaluators. -Evaluators operate on instructions instead of functions. - === Scheduler -Looks at the graph IR and decides when the VM should evaluate what. +Looks at the graph IR and decides when which evaluator gets to evaluate what. -=== VM +=== Evaluator + +Runs instructions given to it in a specific way, +such as for example on the GPU using OpenCL. = Open questions diff --git a/docs/template.typ b/docs/template.typ index 0402015..cedb5e6 100644 --- a/docs/template.typ +++ b/docs/template.typ @@ -33,22 +33,23 @@ // this'd require wrapping the whole document in a show rule // at which point `query` doesn't find anything anymore #let terms = ( + "processing stage", "source", "AST", "graph IR", "runtime", - "evaluator", "optimizer", "scheduler", - "VM", + "evaluator", + "evaluation", "function", "instruction", - "pipeline", "input", "argument", "consumer", "output", "streamer", "modifier", + "pipeline", ) // yes, the shadowing is intentional to avoid accidentally using the list #let terms = regex("\\b(" + terms.map(expand).join("|") + ")\\b") From d79383a7dff9c79754846e5713160acfb18fc7c1 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 23 Jan 2024 12:40:25 +0100 Subject: [PATCH 079/189] cleanup: remove unneeded source format in read instruction The image crate is able to infer the format, so that data is redundant --- crates/eval/src/kind/debug/instr/mod.rs | 2 +- crates/ir/src/instruction/read.rs | 7 ------- testfiles/bare.ron | 1 - testfiles/invert.ron | 1 - 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/crates/eval/src/kind/debug/instr/mod.rs b/crates/eval/src/kind/debug/instr/mod.rs index 14afac8..77e4101 100644 --- a/crates/eval/src/kind/debug/instr/mod.rs +++ b/crates/eval/src/kind/debug/instr/mod.rs @@ -2,7 +2,7 @@ pub mod read { use image::{io::Reader as ImageReader, DynamicImage}; use ir::instruction::read::{Read, SourceType}; - pub fn read(Read { source, .. }: Read) -> DynamicImage { + pub fn read(Read { source }: Read) -> DynamicImage { // TODO: actual error handling let img = ImageReader::open(match source { SourceType::File(path) => path, diff --git a/crates/ir/src/instruction/read.rs b/crates/ir/src/instruction/read.rs index dfb2275..2e4ab60 100644 --- a/crates/ir/src/instruction/read.rs +++ b/crates/ir/src/instruction/read.rs @@ -4,16 +4,9 @@ use std::path::PathBuf; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct Read { pub source: SourceType, - pub format: SourceFormat, } #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub enum SourceType { File(PathBuf), } - -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -pub enum SourceFormat { - Jpeg, - Png, -} diff --git a/testfiles/bare.ron b/testfiles/bare.ron index de78944..66565bf 100644 --- a/testfiles/bare.ron +++ b/testfiles/bare.ron @@ -2,7 +2,6 @@ instructions: { 0: Read(( source: File("testfiles/rails.png"), - format: Png, )), 1: Write(( target: File("testfiles/gen/out.jpg"), diff --git a/testfiles/invert.ron b/testfiles/invert.ron index ce8e68d..575ad1d 100644 --- a/testfiles/invert.ron +++ b/testfiles/invert.ron @@ -2,7 +2,6 @@ instructions: { 0: Read(( source: File("testfiles/rails.png"), - format: Png, )), 1: Filter(Invert), 2: Write(( From 98850ee1e9f24eb9fd7d3c2f9cb07de38cffa8e6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 8 Mar 2024 12:34:09 +0100 Subject: [PATCH 080/189] lang: lexer --- Cargo.lock | 64 +++++++++++++++++++ Cargo.toml | 3 +- crates/lang/Cargo.toml | 12 ++++ crates/lang/src/lib.rs | 1 + crates/lang/src/tokens.rs | 45 ++++++++++++++ crates/lang/src/tokens/tests.rs | 107 ++++++++++++++++++++++++++++++++ 6 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 crates/lang/Cargo.toml create mode 100644 crates/lang/src/lib.rs create mode 100644 crates/lang/src/tokens.rs create mode 100644 crates/lang/src/tokens/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 7447d0d..5cd0ff9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -94,6 +94,12 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "bit_field" version = "0.10.2" @@ -321,6 +327,12 @@ dependencies = [ "spin", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "getrandom" version = "0.2.12" @@ -400,6 +412,19 @@ dependencies = [ "rayon", ] +[[package]] +name = "lang" +version = "0.1.0" +dependencies = [ + "logos", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "lebe" version = "0.5.2" @@ -433,6 +458,39 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "logos" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161971eb88a0da7ae0c333e1063467c5b5727e7fb6b710b8db4814eade3a42e8" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e31badd9de5131fdf4921f6473d457e3dd85b11b7f091ceb50e4df7c3eeb12a" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2", + "quote", + "regex-syntax", + "syn", +] + +[[package]] +name = "logos-derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c2a69b3eb68d5bd595107c9ee58d7e07fe2bb5e360cc85b0f084dedac80de0a" +dependencies = [ + "logos-codegen", +] + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -580,6 +638,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "ron" version = "0.8.1" diff --git a/Cargo.toml b/Cargo.toml index 6d7f53d..82e4afd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,8 @@ members = [ "crates/app", "crates/eval", - "crates/ir", + "crates/ir", + "crates/lang", ] resolver = "2" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml new file mode 100644 index 0000000..1182341 --- /dev/null +++ b/crates/lang/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "lang" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +logos = "0.14" + +[lints] +workspace = true diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs new file mode 100644 index 0000000..5c76635 --- /dev/null +++ b/crates/lang/src/lib.rs @@ -0,0 +1 @@ +pub mod tokens; diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs new file mode 100644 index 0000000..e21b961 --- /dev/null +++ b/crates/lang/src/tokens.rs @@ -0,0 +1,45 @@ +use logos::Logos; + +#[derive(Logos, Debug, PartialEq, Eq)] +#[logos(skip r"[ \t\n\f]+")] +pub enum Token<'a> { + #[regex("[a-zA-Z0-9_\\-]+", |lex| lex.slice())] + Word(&'a str), + #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] + VarIdent(&'a str), + #[token("@..")] + InputSpread, + #[regex("\\@[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] + InputIdent(&'a str), + #[token(",")] + Comma, + #[token("|")] + Pipe, + #[token("@|")] + MappingPipe, + #[token("!|")] + NullPipe, + #[token("@")] + At, + #[token(">")] + GreaterThan, + #[token("=")] + Equals, + #[token(":")] + Colon, + #[token("[")] + BracketOpen, + #[token("]")] + BracketClose, + #[token("(")] + ParenOpen, + #[token(")")] + ParenClose, + #[token("{")] + BraceOpen, + #[token("}")] + BraceClose, +} + +#[cfg(test)] +mod tests; diff --git a/crates/lang/src/tokens/tests.rs b/crates/lang/src/tokens/tests.rs new file mode 100644 index 0000000..fe4270e --- /dev/null +++ b/crates/lang/src/tokens/tests.rs @@ -0,0 +1,107 @@ +use logos::Logos; + +use super::Token; + +/// generates tests for the lexer to avoid writing boilerplate +macro_rules! lexer_test { + ($name:ident, $input:literal, $out:expr) => { + #[test] + fn $name() { + let lex = Token::lexer($input); + let toks = lex.map(|tok| tok.unwrap()).collect::>(); + assert_eq!(toks, $out); + } + }; +} + +lexer_test! { + test_lex_simple_pipeline, + "streamer | processor | sink", + [ + Token::Word("streamer"), + Token::Pipe, + Token::Word("processor"), + Token::Pipe, + Token::Word("sink") + ] +} + +lexer_test! { + test_lex_var_ident, + "$identifier", + [ Token::VarIdent("identifier") ] +} + +lexer_test! { + test_lex_subgroup, + "subgroup(first, second) = a | b { 1: $first } | c { 1: $second }", + [ + Token::Word("subgroup"), + Token::ParenOpen, + Token::Word("first"), + Token::Comma, + Token::Word("second"), + Token::ParenClose, + Token::Equals, + Token::Word("a"), + Token::Pipe, + Token::Word("b"), + Token::BraceOpen, + Token::Word("1"), + Token::Colon, + Token::VarIdent("first"), + Token::BraceClose, + Token::Pipe, + Token::Word("c"), + Token::BraceOpen, + Token::Word("1"), + Token::Colon, + Token::VarIdent("second"), + Token::BraceClose + ] +} + +lexer_test! { + text_lex_crossing_pipeline_reordering, + "a >first, second|second, first> c", + [ + Token::Word("a"), + Token::GreaterThan, + Token::Word("first"), + Token::Comma, + Token::Word("second"), + Token::Pipe, + Token::Word("second"), + Token::Comma, + Token::Word("first"), + Token::GreaterThan, + Token::Word("c") + ] +} + +lexer_test! { + test_lex_crossing_input_args, + "a >second| c { second: @first }", + [ + Token::Word("a"), + Token::GreaterThan, + Token::Word("second"), + Token::Pipe, + Token::Word("c"), + Token::BraceOpen, + Token::Word("second"), + Token::Colon, + Token::InputIdent("first"), + Token::BraceClose + ] +} + +lexer_test! { + test_lex_map_io_named, + "a @| c", + [ + Token::Word("a"), + Token::MappingPipe, + Token::Word("c") + ] +} From 69f0baf425bbdb744d85b6a8449910b0d6edb2ea Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 15 Mar 2024 16:44:47 +0100 Subject: [PATCH 081/189] svg-filters: init --- Cargo.lock | 136 ++++++++++++++++++ Cargo.toml | 2 +- crates/svg-filters/Cargo.toml | 15 ++ crates/svg-filters/src/lib.rs | 16 +++ crates/svg-filters/src/types.rs | 20 +++ crates/svg-filters/src/types/length.rs | 14 ++ crates/svg-filters/src/types/nodes.rs | 13 ++ .../svg-filters/src/types/nodes/primitives.rs | 51 +++++++ .../src/types/nodes/primitives/blend.rs | 25 ++++ .../types/nodes/primitives/color_matrix.rs | 19 +++ .../nodes/primitives/component_transfer.rs | 27 ++++ .../src/types/nodes/primitives/composite.rs | 13 ++ .../types/nodes/primitives/convolve_matrix.rs | 18 +++ .../nodes/primitives/diffuse_lighting.rs | 2 + .../nodes/primitives/displacement_map.rs | 13 ++ .../src/types/nodes/primitives/flood.rs | 7 + .../types/nodes/primitives/gaussian_blur.rs | 4 + .../src/types/nodes/primitives/image.rs | 2 + .../src/types/nodes/primitives/merge.rs | 2 + .../src/types/nodes/primitives/morphology.rs | 10 ++ .../src/types/nodes/primitives/offset.rs | 5 + .../nodes/primitives/specular_lighting.rs | 2 + .../src/types/nodes/primitives/tile.rs | 2 + .../src/types/nodes/primitives/turbulence.rs | 18 +++ .../src/types/nodes/standard_input.rs | 10 ++ 25 files changed, 445 insertions(+), 1 deletion(-) create mode 100644 crates/svg-filters/Cargo.toml create mode 100644 crates/svg-filters/src/lib.rs create mode 100644 crates/svg-filters/src/types.rs create mode 100644 crates/svg-filters/src/types/length.rs create mode 100644 crates/svg-filters/src/types/nodes.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/blend.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/color_matrix.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/component_transfer.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/composite.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/displacement_map.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/flood.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/image.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/merge.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/morphology.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/offset.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/tile.rs create mode 100644 crates/svg-filters/src/types/nodes/primitives/turbulence.rs create mode 100644 crates/svg-filters/src/types/nodes/standard_input.rs diff --git a/Cargo.lock b/Cargo.lock index 5cd0ff9..a8b1f50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -237,6 +237,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "phf", +] + [[package]] name = "deranged" version = "0.3.11" @@ -273,6 +282,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "eval" version = "0.1.0" @@ -308,6 +323,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.28" @@ -363,6 +384,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -388,6 +415,16 @@ dependencies = [ "tiff", ] +[[package]] +name = "indexmap" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "ir" version = "0.1.0" @@ -491,6 +528,12 @@ dependencies = [ "logos-codegen", ] +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -552,6 +595,58 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "png" version = "0.17.10" @@ -589,6 +684,16 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "quote" version = "1.0.33" @@ -598,6 +703,21 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "rayon" version = "1.8.0" @@ -705,6 +825,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "smallvec" version = "1.11.2" @@ -726,6 +852,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "svg-filters" +version = "0.1.0" +dependencies = [ + "csscolorparser", + "indexmap", + "petgraph", + "quick-xml", +] + [[package]] name = "syn" version = "2.0.41" diff --git a/Cargo.toml b/Cargo.toml index 82e4afd..2ca8bdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = [ "crates/app", "crates/eval", "crates/ir", - "crates/lang", + "crates/lang", "crates/svg-filters", ] resolver = "2" diff --git a/crates/svg-filters/Cargo.toml b/crates/svg-filters/Cargo.toml new file mode 100644 index 0000000..fbe3aaf --- /dev/null +++ b/crates/svg-filters/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "svg-filters" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +csscolorparser = "0.6.2" +indexmap = "2.2.5" +petgraph = "0.6.4" +quick-xml = { version = "0.31.0", features = ["serialize"] } + +[lints] +workspace = true diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs new file mode 100644 index 0000000..11b6708 --- /dev/null +++ b/crates/svg-filters/src/lib.rs @@ -0,0 +1,16 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +pub mod types; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs new file mode 100644 index 0000000..94ecb4b --- /dev/null +++ b/crates/svg-filters/src/types.rs @@ -0,0 +1,20 @@ +use std::collections::HashMap; + +use petgraph::graphmap::DiGraphMap; + +pub mod length; +pub mod nodes; + +use self::{ + length::{Coordinate, Length}, + nodes::Node, +}; + +pub struct Filter<'a> { + graph: DiGraphMap, +} +pub enum Edge<'a> { + Named(&'a str, u8), + /// For standard inputs such as SourceGraphic etc., which we'll just be representing as nodes for simplicity + Unnamed(u8), +} diff --git a/crates/svg-filters/src/types/length.rs b/crates/svg-filters/src/types/length.rs new file mode 100644 index 0000000..4db3fd9 --- /dev/null +++ b/crates/svg-filters/src/types/length.rs @@ -0,0 +1,14 @@ +pub struct Length(f32, Unit); +pub type Coordinate = Length; + +pub enum Unit { + None, + Em, + Ex, + Px, + In, + Cm, + Mm, + Pt, + Pc, +} diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs new file mode 100644 index 0000000..3571e76 --- /dev/null +++ b/crates/svg-filters/src/types/nodes.rs @@ -0,0 +1,13 @@ +use self::{primitives::Primitive, standard_input::StandardInput}; + +use super::length::{Coordinate, Length}; + +pub mod standard_input; + +pub mod primitives; + +pub enum Node { + /// We represent those as Nodes because they're essentially magical nodes + StandardInput(StandardInput), + Primitive(Primitive), +} diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs new file mode 100644 index 0000000..433f190 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -0,0 +1,51 @@ +use crate::types::length::{Coordinate, Length}; + +mod blend; +mod color_matrix; +mod component_transfer; +mod composite; +mod convolve_matrix; +mod diffuse_lighting; +mod displacement_map; +mod flood; +mod gaussian_blur; +mod image; +mod merge; +mod morphology; +mod offset; +mod specular_lighting; +mod tile; +mod turbulence; + +pub struct Primitive { + primitive: FePrimitive, + common_attrs: CommonAttrs, +} + +struct CommonAttrs { + x: Coordinate, + y: Coordinate, + width: Length, + height: Length, +} + +/// svg filter effects primitives +enum FePrimitive { + // 2 inputs + Blend(blend::Blend), + ColorMatrix(color_matrix::ColorMatrix), + ComponentTransfer(component_transfer::ComponentTransfer), + Composite(composite::Composite), + ConvolveMatrix(convolve_matrix::ConvolveMatrix), + DiffuseLighting(diffuse_lighting::DiffuseLighting), + DisplacementMap(displacement_map::DisplacementMap), + Flood(flood::Flood), + GaussianBlur(gaussian_blur::GaussianBlur), + Image(image::Image), + Merge(merge::Merge), + Morphology(morphology::Morphology), + Offset(offset::Offset), + SpecularLighting(specular_lighting::SpecularLighting), + Tile(tile::Tile), + Turbulence(turbulence::Turbulence), +} diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs new file mode 100644 index 0000000..c8972de --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -0,0 +1,25 @@ +/// [feBlend](https://www.w3.org/TR/SVG11/filters.html#feBlendElement) +pub struct Blend { + mode: BlendMode, +} + +/// as according to https://drafts.fxtf.org/compositing-1/#blending +enum BlendMode { + Normal, + Multiply, + Screen, + Overlay, + Darken, + Lighten, + ColorDodge, + ColorBurn, + HardLight, + SoftLight, + Difference, + Exclusion, + + Hue, + Saturation, + Color, + Luminosity, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs new file mode 100644 index 0000000..bdc945e --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -0,0 +1,19 @@ +/// [feColorMatrix](https://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement) +pub struct ColorMatrix { + cm_type: ColorMatrixType, +} + +enum ColorMatrixType { + Matrix { + values: [f32; 20], + }, + Saturate { + // is the values attribute anyway tho + value: f32, + }, + HueRotate { + // also the values attribute + degrees: f32, + }, + LuminanceToAlpha, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs new file mode 100644 index 0000000..6c58d87 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -0,0 +1,27 @@ +/// [feComponentTransfer](https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement) +pub struct ComponentTransfer { + func_r: TransferFunction, + func_g: TransferFunction, + func_b: TransferFunction, + func_a: TransferFunction, +} + +/// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) +enum TransferFunction { + Identity, + Table { + table_values: Vec, + }, + Discrete { + table_values: Vec, + }, + Linear { + slope: f32, + intercept: f32, + }, + Gamma { + amplitude: f32, + exponent: f32, + offset: f32, + }, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/composite.rs b/crates/svg-filters/src/types/nodes/primitives/composite.rs new file mode 100644 index 0000000..ae95447 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/composite.rs @@ -0,0 +1,13 @@ +/// [feComposite](https://www.w3.org/TR/SVG11/filters.html#feCompositeElement) +pub struct Composite { + operator: CompositeOperator, +} + +enum CompositeOperator { + Over, + In, + Out, + Atop, + Xor, + Arithmetic { k1: f32, k2: f32, k3: f32, k4: f32 }, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs new file mode 100644 index 0000000..a619ac9 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs @@ -0,0 +1,18 @@ +pub struct ConvolveMatrix { + order: (u16, u16), + // must be checked to be `order.0 * order.1` + kernel_matrix: Vec, + divisor: f32, + bias: f32, + target_x: i32, + target_y: i32, + edge_mode: EdgeMode, + kernel_unit_length: (f32, f32), + preserve_alpha: bool, +} + +enum EdgeMode { + None, + Duplicate, + Wrap, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs b/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs new file mode 100644 index 0000000..18a0485 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs @@ -0,0 +1,2 @@ +// TODO +pub struct DiffuseLighting; diff --git a/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs new file mode 100644 index 0000000..e59a520 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs @@ -0,0 +1,13 @@ +/// [feDisplacementMap](https://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement) +pub struct DisplacementMap { + scale: f32, + x_channel_selector: Channel, + y_channel_selector: Channel, +} + +enum Channel { + A, + R, + G, + B, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs new file mode 100644 index 0000000..6858c71 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -0,0 +1,7 @@ +use csscolorparser::Color; + +/// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) +pub struct Flood { + flood_color: Color, + flood_opacity: f32, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs new file mode 100644 index 0000000..5ad8047 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs @@ -0,0 +1,4 @@ +/// [feGaussianBlur](https://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement) +pub struct GaussianBlur { + std_deviation: (f32, f32), +} diff --git a/crates/svg-filters/src/types/nodes/primitives/image.rs b/crates/svg-filters/src/types/nodes/primitives/image.rs new file mode 100644 index 0000000..d068c89 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/image.rs @@ -0,0 +1,2 @@ +// TODO +pub struct Image; diff --git a/crates/svg-filters/src/types/nodes/primitives/merge.rs b/crates/svg-filters/src/types/nodes/primitives/merge.rs new file mode 100644 index 0000000..a65df6e --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/merge.rs @@ -0,0 +1,2 @@ +// TODO +pub struct Merge; diff --git a/crates/svg-filters/src/types/nodes/primitives/morphology.rs b/crates/svg-filters/src/types/nodes/primitives/morphology.rs new file mode 100644 index 0000000..6fd50e1 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/morphology.rs @@ -0,0 +1,10 @@ +/// [feMorphology](https://www.w3.org/TR/SVG11/filters.html#feMorphologyElement) +pub struct Morphology { + operator: Operator, + radius: (f32, f32), +} + +enum Operator { + Erode, + Dilate, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/offset.rs b/crates/svg-filters/src/types/nodes/primitives/offset.rs new file mode 100644 index 0000000..1473b0e --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/offset.rs @@ -0,0 +1,5 @@ +/// [feOffset](https://www.w3.org/TR/SVG11/filters.html#feOffsetElement) +pub struct Offset { + dx: f32, + dy: f32, +} diff --git a/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs b/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs new file mode 100644 index 0000000..ab41f49 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs @@ -0,0 +1,2 @@ +// TODO +pub struct SpecularLighting; diff --git a/crates/svg-filters/src/types/nodes/primitives/tile.rs b/crates/svg-filters/src/types/nodes/primitives/tile.rs new file mode 100644 index 0000000..b943271 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/tile.rs @@ -0,0 +1,2 @@ +/// [feTile](https://www.w3.org/TR/SVG11/filters.html#feTileElement) +pub struct Tile; diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs new file mode 100644 index 0000000..998b472 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -0,0 +1,18 @@ +/// [feTurbulence](https://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement) +pub struct Turbulence { + base_frequency: (f32, f32), + num_octaves: (u16), + seed: u32, + stich_tiles: StitchTiles, + // attr name: type + noise_type: NoiseType, +} + +enum StitchTiles { + Stitch, + NoStitch, +} +enum NoiseType { + Turbulence, + FractalNoise, +} diff --git a/crates/svg-filters/src/types/nodes/standard_input.rs b/crates/svg-filters/src/types/nodes/standard_input.rs new file mode 100644 index 0000000..e1ae7d1 --- /dev/null +++ b/crates/svg-filters/src/types/nodes/standard_input.rs @@ -0,0 +1,10 @@ +/// [svg filter effect standard input](https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveInAttribute) +/// technically not a node, but for implementation simplicity... yeah +pub enum StandardInput { + SourceGraphic, + SourceAlpha, + BackgroundImage, + BackgroundAlpha, + FillPaint, + StrokePaint, +} From 56848a1b059da24f09855a027ac101693b83086c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 15 Mar 2024 19:52:40 +0100 Subject: [PATCH 082/189] svg-filters: add basic graph and stuffs --- Cargo.toml | 3 +- crates/app/Cargo.toml | 1 + crates/svg-filters/src/lib.rs | 17 +-- crates/svg-filters/src/main.rs | 54 +++++++++ crates/svg-filters/src/types.rs | 70 ++++++++++- crates/svg-filters/src/types/length.rs | 3 + crates/svg-filters/src/types/nodes.rs | 112 +++++++++++++++++- .../svg-filters/src/types/nodes/primitives.rs | 47 ++++---- .../src/types/nodes/primitives/blend.rs | 20 +++- .../types/nodes/primitives/color_matrix.rs | 24 ++-- .../nodes/primitives/component_transfer.rs | 2 + .../src/types/nodes/primitives/composite.rs | 16 ++- .../types/nodes/primitives/convolve_matrix.rs | 2 + .../nodes/primitives/diffuse_lighting.rs | 1 + .../nodes/primitives/displacement_map.rs | 2 + .../src/types/nodes/primitives/flood.rs | 1 + .../types/nodes/primitives/gaussian_blur.rs | 17 ++- .../src/types/nodes/primitives/image.rs | 1 + .../src/types/nodes/primitives/merge.rs | 1 + .../src/types/nodes/primitives/morphology.rs | 2 + .../src/types/nodes/primitives/offset.rs | 7 ++ .../nodes/primitives/specular_lighting.rs | 1 + .../src/types/nodes/primitives/tile.rs | 1 + .../src/types/nodes/primitives/turbulence.rs | 3 + .../src/types/nodes/standard_input.rs | 1 + 25 files changed, 340 insertions(+), 69 deletions(-) create mode 100644 crates/svg-filters/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 2ca8bdc..cbd514c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,8 @@ members = [ "crates/app", "crates/eval", "crates/ir", - "crates/lang", "crates/svg-filters", + "crates/lang", + "crates/svg-filters", ] resolver = "2" diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 2caaaf4..10182c2 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -2,6 +2,7 @@ name = "app" version = "0.1.0" edition = "2021" +default-run = "app" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index 11b6708..5081a19 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -1,16 +1,5 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right -} - pub mod types; -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub use types::nodes::Node; +pub use types::Edge; +pub use types::Filter; diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs new file mode 100644 index 0000000..d628d3e --- /dev/null +++ b/crates/svg-filters/src/main.rs @@ -0,0 +1,54 @@ +use svg_filters::{types::nodes::primitives::color_matrix::ColorMatrixType, Edge, Filter, Node}; + +fn main() { + let mut filter = Filter::new(); + + // + // + // + // + + // + + // + // + // + + // + // + // + + let chan_r = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])))); + let chan_g = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])))); + let chan_b = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., + ])))); + + let offset_r = filter.add_node(Node::offset(25., 0.)); + let offset_b = filter.add_node(Node::offset(-25., 0.)); + let blur_r = filter.add_node(Node::gaussian_blur_xy(5, 0)); + let blur_b = filter.add_node(Node::gaussian_blur_xy(5, 0)); + + let composite_rb = filter.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); + let composite_final = filter.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); + + filter.graph.extend_with_edges(&[ + (filter.source_graphic(), chan_r, Edge::new()), + (filter.source_graphic(), chan_b, Edge::new()), + (filter.source_graphic(), chan_g, Edge::new()), + (chan_r, offset_r, Edge::new()), + (offset_r, blur_r, Edge::new()), + (chan_b, offset_b, Edge::new()), + (offset_b, blur_b, Edge::new()), + (blur_r, composite_rb, Edge::in_idx(0)), + (blur_b, composite_rb, Edge::in_idx(1)), + (composite_rb, composite_final, Edge::in_idx(0)), + (chan_g, composite_final, Edge::in_idx(1)), + ]); + + println!("{filter:#?}") +} diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs index 94ecb4b..31e0954 100644 --- a/crates/svg-filters/src/types.rs +++ b/crates/svg-filters/src/types.rs @@ -1,20 +1,80 @@ use std::collections::HashMap; -use petgraph::graphmap::DiGraphMap; +use petgraph::{ + adj::EdgeIndex, data::Build, graph::DiGraph, graphmap::DiGraphMap, prelude::NodeIndex, +}; pub mod length; pub mod nodes; +use crate::types::nodes::primitives::color_matrix::{ColorMatrix, ColorMatrixType}; + use self::{ length::{Coordinate, Length}, nodes::Node, }; +#[derive(Debug)] pub struct Filter<'a> { - graph: DiGraphMap, + pub graph: DiGraph>, + source_graphic_idx: NodeIndex, } -pub enum Edge<'a> { - Named(&'a str, u8), + +impl Filter<'_> { + pub fn new() -> Self { + let mut graph = DiGraph::new(); + let source_graphic_idx = graph.add_node(Node::StdInput( + nodes::standard_input::StandardInput::SourceGraphic, + )); + + Self { + graph, + source_graphic_idx, + } + } + + pub fn add_node(&mut self, node: Node) -> NodeIndex { + self.graph.add_node(node) + } + + pub fn source_graphic(&self) -> NodeIndex { + self.source_graphic_idx + } +} + +impl Default for Filter<'_> { + fn default() -> Self { + Self::new() + } +} + +#[derive(Debug, Clone)] +pub struct Edge<'a> { + edge_type: EdgeType<'a>, + /// the index of the `in` attribute on the target element + /// if None, just `in` + in_idx: Option, +} + +impl Edge<'_> { + pub fn new() -> Self { + Self { + edge_type: EdgeType::Unnamed, + in_idx: None, + } + } + + pub fn in_idx(idx: u8) -> Self { + Self { + edge_type: EdgeType::Unnamed, + in_idx: Some(idx), + } + } +} + +#[derive(Debug, Clone)] +pub enum EdgeType<'a> { + Named(&'a str), /// For standard inputs such as SourceGraphic etc., which we'll just be representing as nodes for simplicity - Unnamed(u8), + Unnamed, } diff --git a/crates/svg-filters/src/types/length.rs b/crates/svg-filters/src/types/length.rs index 4db3fd9..1186181 100644 --- a/crates/svg-filters/src/types/length.rs +++ b/crates/svg-filters/src/types/length.rs @@ -1,7 +1,10 @@ +#[derive(Default, Debug)] pub struct Length(f32, Unit); pub type Coordinate = Length; +#[derive(Default, Debug)] pub enum Unit { + #[default] None, Em, Ex, diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 3571e76..29982bc 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -1,13 +1,113 @@ -use self::{primitives::Primitive, standard_input::StandardInput}; +use self::{ + primitives::{ + blend::{Blend, BlendMode}, + color_matrix::{ColorMatrix, ColorMatrixType}, + composite::{Composite, CompositeOperator}, + gaussian_blur::GaussianBlur, + offset::Offset, + FePrimitive, + }, + standard_input::StandardInput, +}; use super::length::{Coordinate, Length}; +pub mod primitives; pub mod standard_input; -pub mod primitives; - +#[derive(Debug)] pub enum Node { - /// We represent those as Nodes because they're essentially magical nodes - StandardInput(StandardInput), - Primitive(Primitive), + StdInput(StandardInput), + Primitive { + primitive: FePrimitive, + common_attrs: CommonAttrs, + }, +} + +impl Default for Node { + fn default() -> Self { + Self::StdInput(StandardInput::SourceGraphic) + } +} + +#[derive(Default, Debug)] +struct CommonAttrs { + x: Coordinate, + y: Coordinate, + width: Length, + height: Length, +} + +impl Node { + pub fn simple(el: FePrimitive) -> Node { + Node::Primitive { + primitive: el, + common_attrs: CommonAttrs::default(), + } + } + + pub fn input_count(&self) -> u8 { + match self { + Node::Primitive { + primitive: + FePrimitive::ColorMatrix(_) + | FePrimitive::ComponentTransfer(_) + | FePrimitive::ConvolveMatrix(_) + | FePrimitive::DiffuseLighting(_) + | FePrimitive::GaussianBlur(_) + | FePrimitive::Morphology(_) + | FePrimitive::Offset(_) + | FePrimitive::SpecularLighting(_) + | FePrimitive::Tile(_), + .. + } => 1, + + Node::Primitive { + primitive: + FePrimitive::Composite(_) | FePrimitive::Blend(_) | FePrimitive::DisplacementMap(_), + .. + } => 2, + + Node::StdInput(_) + | Node::Primitive { + primitive: + FePrimitive::Flood(_) | FePrimitive::Image(_) | FePrimitive::Turbulence(_), + .. + } => 0, + Node::Primitive { + primitive: FePrimitive::Merge(_), + .. + } => todo!(), + } + } + + pub fn blend(mode: BlendMode) -> Self { + Self::simple(FePrimitive::Blend(Blend::new(mode))) + } + + pub fn color_matrix(cm_type: ColorMatrixType) -> Self { + Self::simple(FePrimitive::ColorMatrix(ColorMatrix::new(cm_type))) + } + + pub fn composite(op: CompositeOperator) -> Self { + Self::simple(FePrimitive::Composite(Composite::new(op))) + } + + pub fn composite_arithmetic(k1: f32, k2: f32, k3: f32, k4: f32) -> Self { + Self::simple(FePrimitive::Composite(Composite::arithmetic( + k1, k2, k3, k4, + ))) + } + + pub fn gaussian_blur(v: u16) -> Self { + Self::simple(FePrimitive::GaussianBlur(GaussianBlur::single(v))) + } + + pub fn gaussian_blur_xy(x: u16, y: u16) -> Self { + Self::simple(FePrimitive::GaussianBlur(GaussianBlur::with_xy(x, y))) + } + + pub fn offset(dx: f32, dy: f32) -> Self { + Self::simple(FePrimitive::Offset(Offset::new(dx, dy))) + } } diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 433f190..6be79b3 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -1,36 +1,29 @@ use crate::types::length::{Coordinate, Length}; -mod blend; -mod color_matrix; -mod component_transfer; -mod composite; -mod convolve_matrix; -mod diffuse_lighting; -mod displacement_map; -mod flood; -mod gaussian_blur; -mod image; -mod merge; -mod morphology; -mod offset; -mod specular_lighting; -mod tile; -mod turbulence; +use self::blend::BlendMode; -pub struct Primitive { - primitive: FePrimitive, - common_attrs: CommonAttrs, -} +use super::Node; -struct CommonAttrs { - x: Coordinate, - y: Coordinate, - width: Length, - height: Length, -} +pub mod blend; +pub mod color_matrix; +pub mod component_transfer; +pub mod composite; +pub mod convolve_matrix; +pub mod diffuse_lighting; +pub mod displacement_map; +pub mod flood; +pub mod gaussian_blur; +pub mod image; +pub mod merge; +pub mod morphology; +pub mod offset; +pub mod specular_lighting; +pub mod tile; +pub mod turbulence; /// svg filter effects primitives -enum FePrimitive { +#[derive(Debug)] +pub enum FePrimitive { // 2 inputs Blend(blend::Blend), ColorMatrix(color_matrix::ColorMatrix), diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs index c8972de..242f763 100644 --- a/crates/svg-filters/src/types/nodes/primitives/blend.rs +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -1,10 +1,26 @@ /// [feBlend](https://www.w3.org/TR/SVG11/filters.html#feBlendElement) -pub struct Blend { +#[derive(Debug)] +pub(in crate::types::nodes) struct Blend { mode: BlendMode, } +impl Blend { + pub fn new(mode: BlendMode) -> Self { + Self { mode } + } +} + +impl Default for Blend { + fn default() -> Self { + Self { + mode: BlendMode::Normal, + } + } +} + /// as according to https://drafts.fxtf.org/compositing-1/#blending -enum BlendMode { +#[derive(Debug)] +pub enum BlendMode { Normal, Multiply, Screen, diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs index bdc945e..fbae6b2 100644 --- a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -1,19 +1,19 @@ /// [feColorMatrix](https://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement) +#[derive(Debug)] pub struct ColorMatrix { cm_type: ColorMatrixType, } -enum ColorMatrixType { - Matrix { - values: [f32; 20], - }, - Saturate { - // is the values attribute anyway tho - value: f32, - }, - HueRotate { - // also the values attribute - degrees: f32, - }, +impl ColorMatrix { + pub fn new(cm_type: ColorMatrixType) -> Self { + Self { cm_type } + } +} + +#[derive(Debug)] +pub enum ColorMatrixType { + Matrix(Box<[f32; 20]>), + Saturate(f32), + HueRotate(f32), LuminanceToAlpha, } diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs index 6c58d87..3ccc039 100644 --- a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -1,4 +1,5 @@ /// [feComponentTransfer](https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement) +#[derive(Debug)] pub struct ComponentTransfer { func_r: TransferFunction, func_g: TransferFunction, @@ -7,6 +8,7 @@ pub struct ComponentTransfer { } /// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) +#[derive(Debug)] enum TransferFunction { Identity, Table { diff --git a/crates/svg-filters/src/types/nodes/primitives/composite.rs b/crates/svg-filters/src/types/nodes/primitives/composite.rs index ae95447..c86de26 100644 --- a/crates/svg-filters/src/types/nodes/primitives/composite.rs +++ b/crates/svg-filters/src/types/nodes/primitives/composite.rs @@ -1,9 +1,23 @@ /// [feComposite](https://www.w3.org/TR/SVG11/filters.html#feCompositeElement) +#[derive(Debug)] pub struct Composite { operator: CompositeOperator, } -enum CompositeOperator { +impl Composite { + pub fn new(op: CompositeOperator) -> Self { + Self { operator: op } + } + + pub fn arithmetic(k1: f32, k2: f32, k3: f32, k4: f32) -> Self { + Self { + operator: CompositeOperator::Arithmetic { k1, k2, k3, k4 }, + } + } +} + +#[derive(Debug)] +pub enum CompositeOperator { Over, In, Out, diff --git a/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs index a619ac9..1fe2ef4 100644 --- a/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/convolve_matrix.rs @@ -1,3 +1,4 @@ +#[derive(Debug)] pub struct ConvolveMatrix { order: (u16, u16), // must be checked to be `order.0 * order.1` @@ -11,6 +12,7 @@ pub struct ConvolveMatrix { preserve_alpha: bool, } +#[derive(Debug)] enum EdgeMode { None, Duplicate, diff --git a/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs b/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs index 18a0485..5d9cd6f 100644 --- a/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs +++ b/crates/svg-filters/src/types/nodes/primitives/diffuse_lighting.rs @@ -1,2 +1,3 @@ // TODO +#[derive(Debug)] pub struct DiffuseLighting; diff --git a/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs index e59a520..b6485ac 100644 --- a/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs +++ b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs @@ -1,10 +1,12 @@ /// [feDisplacementMap](https://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement) +#[derive(Debug)] pub struct DisplacementMap { scale: f32, x_channel_selector: Channel, y_channel_selector: Channel, } +#[derive(Debug)] enum Channel { A, R, diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 6858c71..94f6eee 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -1,6 +1,7 @@ use csscolorparser::Color; /// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) +#[derive(Debug)] pub struct Flood { flood_color: Color, flood_opacity: f32, diff --git a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs index 5ad8047..e6ca9c1 100644 --- a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs +++ b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs @@ -1,4 +1,19 @@ /// [feGaussianBlur](https://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement) +#[derive(Debug)] pub struct GaussianBlur { - std_deviation: (f32, f32), + std_deviation: (u16, u16), +} + +impl GaussianBlur { + pub fn single(v: u16) -> Self { + Self { + std_deviation: (v, v), + } + } + + pub fn with_xy(x: u16, y: u16) -> Self { + Self { + std_deviation: (x, y), + } + } } diff --git a/crates/svg-filters/src/types/nodes/primitives/image.rs b/crates/svg-filters/src/types/nodes/primitives/image.rs index d068c89..c52c0b7 100644 --- a/crates/svg-filters/src/types/nodes/primitives/image.rs +++ b/crates/svg-filters/src/types/nodes/primitives/image.rs @@ -1,2 +1,3 @@ // TODO +#[derive(Debug)] pub struct Image; diff --git a/crates/svg-filters/src/types/nodes/primitives/merge.rs b/crates/svg-filters/src/types/nodes/primitives/merge.rs index a65df6e..ab26374 100644 --- a/crates/svg-filters/src/types/nodes/primitives/merge.rs +++ b/crates/svg-filters/src/types/nodes/primitives/merge.rs @@ -1,2 +1,3 @@ // TODO +#[derive(Debug)] pub struct Merge; diff --git a/crates/svg-filters/src/types/nodes/primitives/morphology.rs b/crates/svg-filters/src/types/nodes/primitives/morphology.rs index 6fd50e1..6b33825 100644 --- a/crates/svg-filters/src/types/nodes/primitives/morphology.rs +++ b/crates/svg-filters/src/types/nodes/primitives/morphology.rs @@ -1,9 +1,11 @@ /// [feMorphology](https://www.w3.org/TR/SVG11/filters.html#feMorphologyElement) +#[derive(Debug)] pub struct Morphology { operator: Operator, radius: (f32, f32), } +#[derive(Debug)] enum Operator { Erode, Dilate, diff --git a/crates/svg-filters/src/types/nodes/primitives/offset.rs b/crates/svg-filters/src/types/nodes/primitives/offset.rs index 1473b0e..96b47ef 100644 --- a/crates/svg-filters/src/types/nodes/primitives/offset.rs +++ b/crates/svg-filters/src/types/nodes/primitives/offset.rs @@ -1,5 +1,12 @@ /// [feOffset](https://www.w3.org/TR/SVG11/filters.html#feOffsetElement) +#[derive(Debug)] pub struct Offset { dx: f32, dy: f32, } + +impl Offset { + pub fn new(dx: f32, dy: f32) -> Self { + Self { dx, dy } + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs b/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs index ab41f49..16a6fcc 100644 --- a/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs +++ b/crates/svg-filters/src/types/nodes/primitives/specular_lighting.rs @@ -1,2 +1,3 @@ // TODO +#[derive(Debug)] pub struct SpecularLighting; diff --git a/crates/svg-filters/src/types/nodes/primitives/tile.rs b/crates/svg-filters/src/types/nodes/primitives/tile.rs index b943271..7a957c5 100644 --- a/crates/svg-filters/src/types/nodes/primitives/tile.rs +++ b/crates/svg-filters/src/types/nodes/primitives/tile.rs @@ -1,2 +1,3 @@ /// [feTile](https://www.w3.org/TR/SVG11/filters.html#feTileElement) +#[derive(Debug)] pub struct Tile; diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs index 998b472..ec815cb 100644 --- a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -1,4 +1,5 @@ /// [feTurbulence](https://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement) +#[derive(Debug)] pub struct Turbulence { base_frequency: (f32, f32), num_octaves: (u16), @@ -8,10 +9,12 @@ pub struct Turbulence { noise_type: NoiseType, } +#[derive(Debug)] enum StitchTiles { Stitch, NoStitch, } +#[derive(Debug)] enum NoiseType { Turbulence, FractalNoise, diff --git a/crates/svg-filters/src/types/nodes/standard_input.rs b/crates/svg-filters/src/types/nodes/standard_input.rs index e1ae7d1..add10d0 100644 --- a/crates/svg-filters/src/types/nodes/standard_input.rs +++ b/crates/svg-filters/src/types/nodes/standard_input.rs @@ -1,5 +1,6 @@ /// [svg filter effect standard input](https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveInAttribute) /// technically not a node, but for implementation simplicity... yeah +#[derive(Debug)] pub enum StandardInput { SourceGraphic, SourceAlpha, From 01b188008956104d80f7494cda03a7731fbadf26 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 15 Mar 2024 22:45:28 +0100 Subject: [PATCH 083/189] svg-filters: get bare basic xml generation going --- crates/svg-filters/src/main.rs | 18 ++- crates/svg-filters/src/types.rs | 117 +++++++++++++++++- crates/svg-filters/src/types/nodes.rs | 6 +- .../svg-filters/src/types/nodes/primitives.rs | 59 +++++++++ .../src/types/nodes/primitives/blend.rs | 2 +- .../types/nodes/primitives/color_matrix.rs | 34 +++++ 6 files changed, 227 insertions(+), 9 deletions(-) diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index d628d3e..5531784 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -1,6 +1,20 @@ -use svg_filters::{types::nodes::primitives::color_matrix::ColorMatrixType, Edge, Filter, Node}; +use svg_filters::{ + types::nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, + Edge, Filter, Node, +}; fn main() { + let mut supersimple = Filter::new(); + + let cm = supersimple.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])))); + + supersimple + .graph + .extend_with_edges(&[(supersimple.source_graphic(), cm)]); + dbg!(supersimple.to_svg()); + let mut filter = Filter::new(); // @@ -50,5 +64,5 @@ fn main() { (chan_g, composite_final, Edge::in_idx(1)), ]); - println!("{filter:#?}") + println!("Result: {}", filter.to_svg()) } diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs index 31e0954..df679ba 100644 --- a/crates/svg-filters/src/types.rs +++ b/crates/svg-filters/src/types.rs @@ -1,8 +1,15 @@ -use std::collections::HashMap; +use std::{borrow::Cow, collections::HashMap, fmt::Debug, io::BufWriter, primitive}; use petgraph::{ - adj::EdgeIndex, data::Build, graph::DiGraph, graphmap::DiGraphMap, prelude::NodeIndex, + adj::EdgeIndex, + algo::{toposort, DfsSpace}, + data::{Build, DataMap}, + graph::DiGraph, + graphmap::DiGraphMap, + prelude::NodeIndex, + visit::NodeIndexable, }; +use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter}; pub mod length; pub mod nodes; @@ -11,7 +18,10 @@ use crate::types::nodes::primitives::color_matrix::{ColorMatrix, ColorMatrixType use self::{ length::{Coordinate, Length}, - nodes::Node, + nodes::{ + primitives::{FePrimitive, WriteElement}, + Node, + }, }; #[derive(Debug)] @@ -40,6 +50,52 @@ impl Filter<'_> { pub fn source_graphic(&self) -> NodeIndex { self.source_graphic_idx } + + pub fn to_svg(&self) -> String { + let mut result = Vec::new(); + let mut writer = quick_xml::Writer::new(&mut result); + + let mut dfs_space = DfsSpace::new(&self.graph); + let sorted = toposort(&self.graph, Some(&mut dfs_space)).expect("No cycles! Bad user!"); + + sorted + .into_iter() + .filter_map(|node_idx| { + let node = self + .graph + .node_weight(node_idx) + .expect("toposorting will not return invalid indices"); + + if let Node::Primitive { + primitive, + common_attrs, + } = node + { + Some((node_idx, primitive, common_attrs)) + } else { + None + } + }) + .fold( + &mut writer, + |writer, (node_idx, primitive, common_attrs)| { + let el_writer = primitive.element_writer(writer); + create_input_elements( + &self.graph, + el_writer, + node_idx, + self.graph + .node_weight(node_idx) + .expect("cannot get invalid node_idx from toposort") + .input_count(), + ) + .write_empty() + .expect("should write successfully") + }, + ); + + String::from_utf8_lossy(&result).to_string() + } } impl Default for Filter<'_> { @@ -50,10 +106,10 @@ impl Default for Filter<'_> { #[derive(Debug, Clone)] pub struct Edge<'a> { - edge_type: EdgeType<'a>, + pub edge_type: EdgeType<'a>, /// the index of the `in` attribute on the target element /// if None, just `in` - in_idx: Option, + pub in_idx: Option, } impl Edge<'_> { @@ -72,9 +128,60 @@ impl Edge<'_> { } } +impl Default for Edge<'_> { + fn default() -> Self { + Self::new() + } +} + #[derive(Debug, Clone)] pub enum EdgeType<'a> { Named(&'a str), /// For standard inputs such as SourceGraphic etc., which we'll just be representing as nodes for simplicity Unnamed, } +fn create_input_elements<'a>( + g: &'a DiGraph>, + mut el_writer: ElementWriter<'a, &'a mut Vec>, + node_idx: NodeIndex, + input_count: u8, +) -> ElementWriter<'a, &'a mut Vec> { + let inputs = g + .neighbors_directed(node_idx, petgraph::Direction::Incoming) + .collect::>(); + + if inputs.len() != input_count as usize { + // TODO: better error handling + panic!("input couns didnt match"); + } + + inputs + .into_iter() + .enumerate() + .fold(el_writer, |el_writer, (i, incoming_idx)| { + let incoming_node = g.node_weight(incoming_idx).expect("cannot fail here"); + + // find incoming edge and get weight + let Edge { edge_type, in_idx } = g + .edge_weight( + g.find_edge(incoming_idx, node_idx) + .expect("there should always be an edge"), + ) + .expect("once again, should always exist"); + + let in_attr_name = match in_idx { + None | Some(0) => "in".to_owned(), + Some(n) => format!("in{}", n + 1), + }; + + let v = match incoming_node { + Node::StdInput(std_in) => format!("{std_in:?}"), + Node::Primitive { + primitive, + common_attrs, + } => todo!(), + }; + + el_writer.with_attribute((in_attr_name.as_str(), v.as_str())) + }) +} diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 29982bc..63e041c 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -1,3 +1,7 @@ +use core::panic; + +use quick_xml::events::attributes::Attribute; + use self::{ primitives::{ blend::{Blend, BlendMode}, @@ -31,7 +35,7 @@ impl Default for Node { } #[derive(Default, Debug)] -struct CommonAttrs { +pub(crate) struct CommonAttrs { x: Coordinate, y: Coordinate, width: Length, diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 6be79b3..012fd9a 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -1,3 +1,5 @@ +use quick_xml::{events::attributes::Attribute, ElementWriter, Writer}; + use crate::types::length::{Coordinate, Length}; use self::blend::BlendMode; @@ -21,6 +23,19 @@ pub mod specular_lighting; pub mod tile; pub mod turbulence; +pub trait WriteElement { + fn attrs(&self) -> Vec; + fn tag_name(&self) -> &'static str; + fn element_writer<'writer, 'result>( + &self, + writer: &'writer mut Writer<&'result mut Vec>, + ) -> ElementWriter<'writer, &'result mut Vec> { + writer + .create_element(self.tag_name()) + .with_attributes(self.attrs()) + } +} + /// svg filter effects primitives #[derive(Debug)] pub enum FePrimitive { @@ -42,3 +57,47 @@ pub enum FePrimitive { Tile(tile::Tile), Turbulence(turbulence::Turbulence), } + +impl WriteElement for FePrimitive { + fn attrs(&self) -> std::vec::Vec> { + match self { + FePrimitive::Blend(_) => todo!(), + FePrimitive::ColorMatrix(cm) => cm.attrs(), + FePrimitive::ComponentTransfer(_) => todo!(), + FePrimitive::Composite(_) => todo!(), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), + FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::Flood(_) => todo!(), + FePrimitive::GaussianBlur(_) => todo!(), + FePrimitive::Image(_) => todo!(), + FePrimitive::Merge(_) => todo!(), + FePrimitive::Morphology(_) => todo!(), + FePrimitive::Offset(_) => todo!(), + FePrimitive::SpecularLighting(_) => todo!(), + FePrimitive::Tile(_) => todo!(), + FePrimitive::Turbulence(_) => todo!(), + } + } + + fn tag_name(&self) -> &'static str { + match self { + FePrimitive::Blend(_) => todo!(), + FePrimitive::ColorMatrix(cm) => cm.tag_name(), + FePrimitive::ComponentTransfer(_) => todo!(), + FePrimitive::Composite(_) => todo!(), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), + FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::Flood(_) => todo!(), + FePrimitive::GaussianBlur(_) => todo!(), + FePrimitive::Image(_) => todo!(), + FePrimitive::Merge(_) => todo!(), + FePrimitive::Morphology(_) => todo!(), + FePrimitive::Offset(_) => todo!(), + FePrimitive::SpecularLighting(_) => todo!(), + FePrimitive::Tile(_) => todo!(), + FePrimitive::Turbulence(_) => todo!(), + } + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs index 242f763..1aba6d0 100644 --- a/crates/svg-filters/src/types/nodes/primitives/blend.rs +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -1,6 +1,6 @@ /// [feBlend](https://www.w3.org/TR/SVG11/filters.html#feBlendElement) #[derive(Debug)] -pub(in crate::types::nodes) struct Blend { +pub struct Blend { mode: BlendMode, } diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs index fbae6b2..ef32b60 100644 --- a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -1,3 +1,9 @@ +use std::borrow::Cow; + +use quick_xml::{events::attributes::Attribute, name::QName, se::to_string}; + +use super::WriteElement; + /// [feColorMatrix](https://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement) #[derive(Debug)] pub struct ColorMatrix { @@ -10,6 +16,34 @@ impl ColorMatrix { } } +impl WriteElement for ColorMatrix { + fn attrs(&self) -> Vec { + match &self.cm_type { + ColorMatrixType::Matrix(v) => vec![Attribute { + key: QName(b"values"), + value: Cow::from( + v.iter() + .map(|v| v.to_string()) + .reduce(|mut acc, e| { + acc.push(' '); + acc.push_str(&e); + acc + }) + .expect("Should be able to concatenate the thingies") + .into_bytes(), + ), + }], + ColorMatrixType::Saturate(v) => todo!(), + ColorMatrixType::HueRotate(v) => todo!(), + ColorMatrixType::LuminanceToAlpha => todo!(), + } + } + + fn tag_name(&self) -> &'static str { + "feColorMatrix" + } +} + #[derive(Debug)] pub enum ColorMatrixType { Matrix(Box<[f32; 20]>), From a42ec014e550a4c3570e920c533ac5844e4fa499 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 16 Mar 2024 00:35:23 +0100 Subject: [PATCH 084/189] svg-filters: get svg generation working!!!! --- crates/svg-filters/src/lib.rs | 3 +- crates/svg-filters/src/main.rs | 35 ++-- crates/svg-filters/src/types.rs | 169 ++++++++++++------ .../svg-filters/src/types/nodes/primitives.rs | 16 +- .../src/types/nodes/primitives/composite.rs | 53 ++++++ .../types/nodes/primitives/gaussian_blur.rs | 21 +++ .../src/types/nodes/primitives/offset.rs | 25 +++ 7 files changed, 237 insertions(+), 85 deletions(-) diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index 5081a19..a87a611 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -1,5 +1,6 @@ -pub mod types; +#![feature(lint_reasons)] +pub mod types; pub use types::nodes::Node; pub use types::Edge; pub use types::Filter; diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index 5531784..fb6a782 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -4,17 +4,6 @@ use svg_filters::{ }; fn main() { - let mut supersimple = Filter::new(); - - let cm = supersimple.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ - 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., - ])))); - - supersimple - .graph - .extend_with_edges(&[(supersimple.source_graphic(), cm)]); - dbg!(supersimple.to_svg()); - let mut filter = Filter::new(); // @@ -51,18 +40,18 @@ fn main() { let composite_final = filter.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); filter.graph.extend_with_edges(&[ - (filter.source_graphic(), chan_r, Edge::new()), - (filter.source_graphic(), chan_b, Edge::new()), - (filter.source_graphic(), chan_g, Edge::new()), - (chan_r, offset_r, Edge::new()), - (offset_r, blur_r, Edge::new()), - (chan_b, offset_b, Edge::new()), - (offset_b, blur_b, Edge::new()), - (blur_r, composite_rb, Edge::in_idx(0)), - (blur_b, composite_rb, Edge::in_idx(1)), - (composite_rb, composite_final, Edge::in_idx(0)), - (chan_g, composite_final, Edge::in_idx(1)), + (filter.source_graphic(), chan_r, Edge::unnamed()), + (filter.source_graphic(), chan_b, Edge::unnamed()), + (filter.source_graphic(), chan_g, Edge::unnamed()), + (chan_r, offset_r, Edge::new("ro")), + (offset_r, blur_r, Edge::new("rob")), + (chan_b, offset_b, Edge::new("bo")), + (offset_b, blur_b, Edge::new("bob")), + (blur_r, composite_rb, Edge::new("robc").with_idx(0)), + (blur_b, composite_rb, Edge::new("bobc").with_idx(1)), + (composite_rb, composite_final, Edge::new("cf").with_idx(0)), + (chan_g, composite_final, Edge::new("gf").with_idx(1)), ]); - println!("Result: {}", filter.to_svg()) + println!("{}", filter.to_svg()) } diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs index df679ba..325a869 100644 --- a/crates/svg-filters/src/types.rs +++ b/crates/svg-filters/src/types.rs @@ -1,4 +1,11 @@ -use std::{borrow::Cow, collections::HashMap, fmt::Debug, io::BufWriter, primitive}; +use core::panic; +use std::{ + borrow::Cow, + collections::{HashMap, HashSet}, + fmt::Debug, + io::BufWriter, + primitive, +}; use petgraph::{ adj::EdgeIndex, @@ -9,7 +16,7 @@ use petgraph::{ prelude::NodeIndex, visit::NodeIndexable, }; -use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter}; +use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter, Error}; pub mod length; pub mod nodes; @@ -53,47 +60,53 @@ impl Filter<'_> { pub fn to_svg(&self) -> String { let mut result = Vec::new(); - let mut writer = quick_xml::Writer::new(&mut result); + // let mut doc_writer = quick_xml::Writer::new(&mut result); + let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 2); - let mut dfs_space = DfsSpace::new(&self.graph); - let sorted = toposort(&self.graph, Some(&mut dfs_space)).expect("No cycles! Bad user!"); + doc_writer + .create_element("filter") + .with_attribute(("id", "chromabb_gen")) + .write_inner_content(|writer| { + let mut dfs_space = DfsSpace::new(&self.graph); + let sorted = + toposort(&self.graph, Some(&mut dfs_space)).expect("No cycles! Bad user!"); - sorted - .into_iter() - .filter_map(|node_idx| { - let node = self - .graph - .node_weight(node_idx) - .expect("toposorting will not return invalid indices"); - - if let Node::Primitive { - primitive, - common_attrs, - } = node - { - Some((node_idx, primitive, common_attrs)) - } else { - None - } - }) - .fold( - &mut writer, - |writer, (node_idx, primitive, common_attrs)| { - let el_writer = primitive.element_writer(writer); - create_input_elements( - &self.graph, - el_writer, - node_idx, - self.graph + let v = sorted + .into_iter() + .filter_map(|node_idx| { + let node = self + .graph .node_weight(node_idx) - .expect("cannot get invalid node_idx from toposort") - .input_count(), - ) - .write_empty() - .expect("should write successfully") - }, - ); + .expect("toposorting will not return invalid indices"); + if let Node::Primitive { + primitive, + common_attrs, + } = node + { + Some((node_idx, primitive, common_attrs)) + } else { + None + } + }) + .try_fold(writer, |acc, (node_idx, primitive, common_attrs)| { + let mut el_writer = primitive.element_writer(&mut *acc); + el_writer = create_input_attr( + &self.graph, + el_writer, + node_idx, + self.graph + .node_weight(node_idx) + .expect("cannot get invalid node_idx from toposort") + .input_count(), + ); + create_output_attr(&self.graph, el_writer, node_idx).write_empty() + }) + .map(|_| ()); + + Ok::<(), Error>(()) + }) + .expect("shouldnt fail to write or something"); String::from_utf8_lossy(&result).to_string() } } @@ -112,25 +125,31 @@ pub struct Edge<'a> { pub in_idx: Option, } -impl Edge<'_> { - pub fn new() -> Self { +impl<'a> Edge<'a> { + pub fn new(name: &'a str) -> Self { Self { - edge_type: EdgeType::Unnamed, + edge_type: EdgeType::Named(name), in_idx: None, } } - pub fn in_idx(idx: u8) -> Self { + #[must_use] + pub fn with_idx(mut self, idx: u8) -> Self { + self.in_idx = Some(idx); + self + } + + pub fn unnamed() -> Self { Self { edge_type: EdgeType::Unnamed, - in_idx: Some(idx), + in_idx: None, } } } impl Default for Edge<'_> { fn default() -> Self { - Self::new() + Self::unnamed() } } @@ -140,12 +159,13 @@ pub enum EdgeType<'a> { /// For standard inputs such as SourceGraphic etc., which we'll just be representing as nodes for simplicity Unnamed, } -fn create_input_elements<'a>( - g: &'a DiGraph>, - mut el_writer: ElementWriter<'a, &'a mut Vec>, + +fn create_input_attr<'w, 'b>( + g: &'_ DiGraph>, + mut el_writer: ElementWriter<'w, &'b mut Vec>, node_idx: NodeIndex, input_count: u8, -) -> ElementWriter<'a, &'a mut Vec> { +) -> ElementWriter<'w, &'b mut Vec> { let inputs = g .neighbors_directed(node_idx, petgraph::Direction::Incoming) .collect::>(); @@ -176,12 +196,55 @@ fn create_input_elements<'a>( let v = match incoming_node { Node::StdInput(std_in) => format!("{std_in:?}"), - Node::Primitive { - primitive, - common_attrs, - } => todo!(), + Node::Primitive { .. } => { + if let EdgeType::Named(name) = edge_type { + (*name).to_owned() + } else { + panic!( + "unnamed edges should not be used for connections between primitives" + ) + } + } }; el_writer.with_attribute((in_attr_name.as_str(), v.as_str())) }) } + +#[allow(clippy::unwrap_used, reason = "all unwraps are for finding on options")] +fn create_output_attr<'w, 'b>( + g: &'_ DiGraph>, + mut el_writer: ElementWriter<'w, &'b mut Vec>, + node_idx: NodeIndex, +) -> ElementWriter<'w, &'b mut Vec> { + let output = g + .neighbors_directed(node_idx, petgraph::Direction::Outgoing) + .map(|neighbor_idx| { + let edge_idx = g.find_edge(node_idx, neighbor_idx).unwrap(); + + let Edge { + edge_type: EdgeType::Named(name), + .. + } = g.edge_weight(edge_idx).unwrap() + else { + panic!("Unnamed edge used for connection between primitives"); + }; + *name + }) + .collect::>(); + + if output.is_empty() { + el_writer + } else if output.len() == 1 { + el_writer.with_attribute(Attribute { + key: QName(b"result"), + value: Cow::from( + (*output.into_iter().collect::>().first().unwrap()) + .to_string() + .into_bytes(), + ), + }) + } else { + panic!("Can't have more then one named output: {output:?}") + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 012fd9a..513f1a8 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -62,18 +62,18 @@ impl WriteElement for FePrimitive { fn attrs(&self) -> std::vec::Vec> { match self { FePrimitive::Blend(_) => todo!(), - FePrimitive::ColorMatrix(cm) => cm.attrs(), + FePrimitive::ColorMatrix(el) => el.attrs(), FePrimitive::ComponentTransfer(_) => todo!(), - FePrimitive::Composite(_) => todo!(), + FePrimitive::Composite(el) => el.attrs(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), FePrimitive::Flood(_) => todo!(), - FePrimitive::GaussianBlur(_) => todo!(), + FePrimitive::GaussianBlur(el) => el.attrs(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), - FePrimitive::Offset(_) => todo!(), + FePrimitive::Offset(el) => el.attrs(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), FePrimitive::Turbulence(_) => todo!(), @@ -83,18 +83,18 @@ impl WriteElement for FePrimitive { fn tag_name(&self) -> &'static str { match self { FePrimitive::Blend(_) => todo!(), - FePrimitive::ColorMatrix(cm) => cm.tag_name(), + FePrimitive::ColorMatrix(el) => el.tag_name(), FePrimitive::ComponentTransfer(_) => todo!(), - FePrimitive::Composite(_) => todo!(), + FePrimitive::Composite(el) => el.tag_name(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), FePrimitive::Flood(_) => todo!(), - FePrimitive::GaussianBlur(_) => todo!(), + FePrimitive::GaussianBlur(el) => el.tag_name(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), - FePrimitive::Offset(_) => todo!(), + FePrimitive::Offset(el) => el.tag_name(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), FePrimitive::Turbulence(_) => todo!(), diff --git a/crates/svg-filters/src/types/nodes/primitives/composite.rs b/crates/svg-filters/src/types/nodes/primitives/composite.rs index c86de26..e27664d 100644 --- a/crates/svg-filters/src/types/nodes/primitives/composite.rs +++ b/crates/svg-filters/src/types/nodes/primitives/composite.rs @@ -1,3 +1,9 @@ +use std::borrow::Cow; + +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; + /// [feComposite](https://www.w3.org/TR/SVG11/filters.html#feCompositeElement) #[derive(Debug)] pub struct Composite { @@ -25,3 +31,50 @@ pub enum CompositeOperator { Xor, Arithmetic { k1: f32, k2: f32, k3: f32, k4: f32 }, } + +impl WriteElement for Composite { + fn attrs(&self) -> Vec { + let (op_name, vals) = match self.operator { + CompositeOperator::Over => ("over", None), + CompositeOperator::In => ("in", None), + CompositeOperator::Out => ("out", None), + CompositeOperator::Atop => ("atop", None), + CompositeOperator::Xor => ("xor", None), + CompositeOperator::Arithmetic { k1, k2, k3, k4 } => { + ("arithmetic", Some([k1, k2, k3, k4])) + } + }; + + let mut r = vec![Attribute { + key: QName(b"operator"), + value: Cow::from(op_name.as_bytes()), + }]; + + if let Some([k1, k2, k3, k4]) = vals { + r.append(&mut vec![ + Attribute { + key: QName(b"k1"), + value: Cow::from(k1.to_string().into_bytes()), + }, + Attribute { + key: QName(b"k2"), + value: Cow::from(k2.to_string().into_bytes()), + }, + Attribute { + key: QName(b"k3"), + value: Cow::from(k3.to_string().into_bytes()), + }, + Attribute { + key: QName(b"k4"), + value: Cow::from(k4.to_string().into_bytes()), + }, + ]); + } + + r + } + + fn tag_name(&self) -> &'static str { + "feComposite" + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs index e6ca9c1..a0c42bd 100644 --- a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs +++ b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs @@ -1,3 +1,9 @@ +use std::borrow::Cow; + +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; + /// [feGaussianBlur](https://www.w3.org/TR/SVG11/filters.html#feGaussianBlurElement) #[derive(Debug)] pub struct GaussianBlur { @@ -17,3 +23,18 @@ impl GaussianBlur { } } } + +impl WriteElement for GaussianBlur { + fn attrs(&self) -> Vec { + vec![Attribute { + key: QName(b"stdDeviation"), + value: Cow::from( + format!("{} {}", self.std_deviation.0, self.std_deviation.1).into_bytes(), + ), + }] + } + + fn tag_name(&self) -> &'static str { + "feGaussianBlur" + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/offset.rs b/crates/svg-filters/src/types/nodes/primitives/offset.rs index 96b47ef..4cad35b 100644 --- a/crates/svg-filters/src/types/nodes/primitives/offset.rs +++ b/crates/svg-filters/src/types/nodes/primitives/offset.rs @@ -1,3 +1,9 @@ +use std::borrow::Cow; + +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; + /// [feOffset](https://www.w3.org/TR/SVG11/filters.html#feOffsetElement) #[derive(Debug)] pub struct Offset { @@ -10,3 +16,22 @@ impl Offset { Self { dx, dy } } } + +impl WriteElement for Offset { + fn attrs(&self) -> Vec { + vec![ + Attribute { + key: QName(b"dx"), + value: Cow::from(self.dx.to_string().into_bytes()), + }, + Attribute { + key: QName(b"dy"), + value: Cow::from(self.dy.to_string().into_bytes()), + }, + ] + } + + fn tag_name(&self) -> &'static str { + "feOffset" + } +} From 5368951254e89a92122c7e90e9cb02a8bdc727c3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 16 Mar 2024 20:52:45 +0100 Subject: [PATCH 085/189] svg-filters: rework codegen --- crates/svg-filters/src/codegen.rs | 229 ++++++++++++++++++++ crates/svg-filters/src/lib.rs | 6 +- crates/svg-filters/src/main.rs | 58 ++--- crates/svg-filters/src/types.rs | 284 +++++-------------------- crates/svg-filters/src/types/length.rs | 29 ++- crates/svg-filters/src/types/nodes.rs | 22 +- 6 files changed, 361 insertions(+), 267 deletions(-) create mode 100644 crates/svg-filters/src/codegen.rs diff --git a/crates/svg-filters/src/codegen.rs b/crates/svg-filters/src/codegen.rs new file mode 100644 index 0000000..ca0baa3 --- /dev/null +++ b/crates/svg-filters/src/codegen.rs @@ -0,0 +1,229 @@ +use std::{ + borrow::Cow, + cmp, + collections::{BTreeSet, HashMap, HashSet}, +}; + +use indexmap::IndexMap; +use petgraph::{ + algo::toposort, + graph::DiGraph, + prelude::{EdgeIndex, NodeIndex}, +}; +use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter}; + +use crate::{ + types::{ + graph::{edge::Edge, FilterGraph}, + nodes::{primitives::WriteElement, CommonAttrs}, + }, + Node, +}; + +use self::error::CodegenError; + +pub struct SvgDocument { + filters: HashMap, +} + +impl SvgDocument { + pub fn new() -> Self { + Self { + filters: HashMap::new(), + } + } + + #[allow(clippy::unwrap_used, reason = "we literally just did the insertion")] + pub fn create_filter(&mut self, id: impl ToString) -> &mut FilterGraph { + let filter = FilterGraph::new(); + + self.filters.insert(id.to_string(), filter); + self.filters.get_mut(&id.to_string()).unwrap() + } + + pub fn generate_svg(&self) -> String { + let mut result = Vec::new(); + let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 4); + + doc_writer + .create_element("svg") + .write_inner_content(|writer| { + self.filters + .iter() + .try_fold(writer, Self::gen_filter) + .map(|_| {}) + }); + + String::from_utf8_lossy(&result).to_string() + } + + fn gen_filter<'w, 'r>( + writer: &'w mut quick_xml::Writer<&'r mut Vec>, + (id, graph): (&String, &FilterGraph), + ) -> Result<&'w mut quick_xml::Writer<&'r mut Vec>, CodegenError> { + writer + .create_element("filter") + .with_attribute(("id", id.as_str())) + .write_inner_content(|writer| Self::graph_to_svg(writer, graph)) + } + + fn graph_to_svg( + writer: &mut quick_xml::Writer<&mut Vec>, + graph: &FilterGraph, + ) -> Result<(), CodegenError> { + let sorted = toposort(&graph.dag, None).expect("no cycles allowed in a DAG"); + sorted + .into_iter() + .filter_map(|node_idx| { + graph + .dag + .node_weight(node_idx) + .and_then(|node| node.primitive()) + .map(|(primitive, common_attrs)| (node_idx, primitive, common_attrs)) + }) + .try_fold(writer, |writer, (node_idx, primitive, common_attrs)| { + let mut el_writer = primitive.element_writer(writer); + el_writer = input_attrs(node_idx, &graph.dag).write_into(el_writer); + el_writer = output_attrs(node_idx, &graph.dag).write_into(el_writer); + el_writer = Attrs::from(*common_attrs).write_into(el_writer); + el_writer.write_empty() + })?; + + Ok(()) + } +} + +struct Attrs(IndexMap); + +impl Attrs { + fn write_into<'w, 'b>( + self, + el_writer: ElementWriter<'w, &'b mut Vec>, + ) -> ElementWriter<'w, &'b mut Vec> { + let attrs = self.0.iter().map(|(k, v)| (k.as_str(), v.as_str())); + el_writer.with_attributes(attrs) + } +} + +impl From for Attrs { + fn from(value: CommonAttrs) -> Self { + let CommonAttrs { + x, + y, + width, + height, + } = value; + Self(IndexMap::from([ + ("x".to_owned(), x.to_string()), + ("y".to_owned(), y.to_string()), + ("width".to_owned(), width.to_string()), + ("height".to_owned(), height.to_string()), + ])) + } +} + +#[allow( + clippy::unwrap_used, + reason = "in all cases of use of unwrap, it's values we got from the graph so we know it's safe" +)] +fn input_attrs(node_idx: NodeIndex, g: &DiGraph) -> Attrs { + let inputs: Vec = g + .neighbors_directed(node_idx, petgraph::Direction::Incoming) + .collect(); + let node = g.node_weight(node_idx).unwrap(); + + if node.input_count() as usize != inputs.len() { + todo!("proper error handling for wrong numbers of inputs") + } + + let mut inputs = inputs + .into_iter() + .map(|input_idx| { + let edge_idx = g.find_edge(input_idx, node_idx).unwrap(); + let edge = g.edge_weight(edge_idx).unwrap(); + let input_node = g.node_weight(input_idx).unwrap(); + + (input_node, edge_idx, edge) + }) + .collect::>(); + inputs.sort_by(|a, b| a.2.cmp(b.2)); + + let mut uniq = BTreeSet::new(); + let no_duplicates = inputs.iter().all(|(_, _, edge)| uniq.insert(edge)); + + if no_duplicates { + Attrs( + inputs + .into_iter() + .map(|(input, edge_idx, edge)| { + let name = match input { + Node::StdInput(s) => format!("{s:?}"), + Node::Primitive { .. } => format_edge_idx(edge_idx), + }; + (edge.to_string(), name) + }) + .collect(), + ) + } else { + todo!("better error handling for inputs with multiple values") + } +} + +#[allow( + clippy::unwrap_used, + reason = "in all cases of use of unwrap, it's values we got from the graph so we know it's safe" +)] +fn output_attrs(node_idx: NodeIndex, g: &DiGraph) -> Attrs { + let outputs: Vec = g + .neighbors_directed(node_idx, petgraph::Direction::Outgoing) + .collect(); + + match outputs.len().cmp(&1) { + cmp::Ordering::Less => Attrs(IndexMap::new()), + cmp::Ordering::Equal => { + let output = outputs.first().unwrap(); + let edge_idx = g.find_edge(node_idx, *output).unwrap(); + Attrs(IndexMap::from([( + "result".to_string(), + format_edge_idx(edge_idx), + )])) + } + cmp::Ordering::Greater => todo!("better error handling for too many outputs"), + } +} + +/// convenience method to avoid fuckups during future changes +fn format_edge_idx(idx: EdgeIndex) -> String { + format!("edge{}", idx.index()) +} + +mod error { + use std::{error::Error, fmt::Display}; + + #[derive(Debug)] + pub enum CodegenError { + QuickXmlError(quick_xml::Error), + } + + impl From for CodegenError { + fn from(value: quick_xml::Error) -> Self { + Self::QuickXmlError(value) + } + } + + impl Display for CodegenError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + CodegenError::QuickXmlError(e) => e.fmt(f), + } + } + } + + impl Error for CodegenError {} +} + +impl Default for SvgDocument { + fn default() -> Self { + Self::new() + } +} diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index a87a611..cc443d8 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -1,6 +1,8 @@ #![feature(lint_reasons)] +pub mod codegen; pub mod types; pub use types::nodes::Node; -pub use types::Edge; -pub use types::Filter; + +#[cfg(test)] +mod tests {} diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index fb6a782..7caef27 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -1,11 +1,12 @@ +use std::hint::black_box; + use svg_filters::{ - types::nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, - Edge, Filter, Node, + codegen::SvgDocument, + types::{graph::edge::Edge, nodes::primitives::color_matrix::ColorMatrixType}, + Node, }; fn main() { - let mut filter = Filter::new(); - // // // @@ -21,37 +22,42 @@ fn main() { // // - let chan_r = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + let mut doc = SvgDocument::new(); + let chromabb = doc.create_filter("chromabb_gen"); + + let chan_r = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., ])))); - let chan_g = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + let chan_g = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., ])))); - let chan_b = filter.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ + let chan_b = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., ])))); - let offset_r = filter.add_node(Node::offset(25., 0.)); - let offset_b = filter.add_node(Node::offset(-25., 0.)); - let blur_r = filter.add_node(Node::gaussian_blur_xy(5, 0)); - let blur_b = filter.add_node(Node::gaussian_blur_xy(5, 0)); + let offset_r = chromabb.add_node(Node::offset(25., 0.)); + let offset_b = chromabb.add_node(Node::offset(-25., 0.)); + let blur_r = chromabb.add_node(Node::gaussian_blur_xy(5, 0)); + let blur_b = chromabb.add_node(Node::gaussian_blur_xy(5, 0)); - let composite_rb = filter.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); - let composite_final = filter.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); + let composite_rb = chromabb.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); + let composite_final = chromabb.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); - filter.graph.extend_with_edges(&[ - (filter.source_graphic(), chan_r, Edge::unnamed()), - (filter.source_graphic(), chan_b, Edge::unnamed()), - (filter.source_graphic(), chan_g, Edge::unnamed()), - (chan_r, offset_r, Edge::new("ro")), - (offset_r, blur_r, Edge::new("rob")), - (chan_b, offset_b, Edge::new("bo")), - (offset_b, blur_b, Edge::new("bob")), - (blur_r, composite_rb, Edge::new("robc").with_idx(0)), - (blur_b, composite_rb, Edge::new("bobc").with_idx(1)), - (composite_rb, composite_final, Edge::new("cf").with_idx(0)), - (chan_g, composite_final, Edge::new("gf").with_idx(1)), + chromabb.dag.extend_with_edges(&[ + (chromabb.source_graphic(), chan_r), + (chromabb.source_graphic(), chan_b), + (chromabb.source_graphic(), chan_g), + (chan_r, offset_r), + (offset_r, blur_r), + (chan_b, offset_b), + (offset_b, blur_b), + ]); + chromabb.dag.extend_with_edges(&[ + (blur_r, composite_rb, Edge::new(0)), + (blur_b, composite_rb, Edge::new(1)), + (composite_rb, composite_final, Edge::new(0)), + (chan_g, composite_final, Edge::new(1)), ]); - println!("{}", filter.to_svg()) + black_box(doc.generate_svg()); } diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs index 325a869..fa3941e 100644 --- a/crates/svg-filters/src/types.rs +++ b/crates/svg-filters/src/types.rs @@ -1,250 +1,70 @@ -use core::panic; -use std::{ - borrow::Cow, - collections::{HashMap, HashSet}, - fmt::Debug, - io::BufWriter, - primitive, -}; - -use petgraph::{ - adj::EdgeIndex, - algo::{toposort, DfsSpace}, - data::{Build, DataMap}, - graph::DiGraph, - graphmap::DiGraphMap, - prelude::NodeIndex, - visit::NodeIndexable, -}; -use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter, Error}; - pub mod length; pub mod nodes; -use crate::types::nodes::primitives::color_matrix::{ColorMatrix, ColorMatrixType}; +// pub mod old; -use self::{ - length::{Coordinate, Length}, - nodes::{ - primitives::{FePrimitive, WriteElement}, - Node, - }, -}; +pub mod graph { + use std::iter::Iterator; -#[derive(Debug)] -pub struct Filter<'a> { - pub graph: DiGraph>, - source_graphic_idx: NodeIndex, -} + use petgraph::{data::Build, prelude::*}; -impl Filter<'_> { - pub fn new() -> Self { - let mut graph = DiGraph::new(); - let source_graphic_idx = graph.add_node(Node::StdInput( - nodes::standard_input::StandardInput::SourceGraphic, - )); + use crate::Node; - Self { - graph, - source_graphic_idx, + use self::edge::Edge; + + use super::nodes::standard_input::StandardInput; + + #[derive(Debug)] + pub struct FilterGraph { + pub dag: DiGraph, + source_graphic_idx: NodeIndex, + } + + impl FilterGraph { + pub fn new() -> Self { + let mut dag = DiGraph::new(); + let source_graphic_idx = dag.add_node(Node::StdInput(StandardInput::SourceGraphic)); + + Self { + dag, + source_graphic_idx, + } + } + + pub fn add_node(&mut self, node: Node) -> NodeIndex { + self.dag.add_node(node) + } + + pub fn source_graphic(&self) -> NodeIndex { + self.source_graphic_idx } } - pub fn add_node(&mut self, node: Node) -> NodeIndex { - self.graph.add_node(node) - } - - pub fn source_graphic(&self) -> NodeIndex { - self.source_graphic_idx - } - - pub fn to_svg(&self) -> String { - let mut result = Vec::new(); - // let mut doc_writer = quick_xml::Writer::new(&mut result); - let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 2); - - doc_writer - .create_element("filter") - .with_attribute(("id", "chromabb_gen")) - .write_inner_content(|writer| { - let mut dfs_space = DfsSpace::new(&self.graph); - let sorted = - toposort(&self.graph, Some(&mut dfs_space)).expect("No cycles! Bad user!"); - - let v = sorted - .into_iter() - .filter_map(|node_idx| { - let node = self - .graph - .node_weight(node_idx) - .expect("toposorting will not return invalid indices"); - - if let Node::Primitive { - primitive, - common_attrs, - } = node - { - Some((node_idx, primitive, common_attrs)) - } else { - None - } - }) - .try_fold(writer, |acc, (node_idx, primitive, common_attrs)| { - let mut el_writer = primitive.element_writer(&mut *acc); - el_writer = create_input_attr( - &self.graph, - el_writer, - node_idx, - self.graph - .node_weight(node_idx) - .expect("cannot get invalid node_idx from toposort") - .input_count(), - ); - create_output_attr(&self.graph, el_writer, node_idx).write_empty() - }) - .map(|_| ()); - - Ok::<(), Error>(()) - }) - .expect("shouldnt fail to write or something"); - String::from_utf8_lossy(&result).to_string() - } -} - -impl Default for Filter<'_> { - fn default() -> Self { - Self::new() - } -} - -#[derive(Debug, Clone)] -pub struct Edge<'a> { - pub edge_type: EdgeType<'a>, - /// the index of the `in` attribute on the target element - /// if None, just `in` - pub in_idx: Option, -} - -impl<'a> Edge<'a> { - pub fn new(name: &'a str) -> Self { - Self { - edge_type: EdgeType::Named(name), - in_idx: None, + pub mod edge { + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] + pub struct Edge { + input_idx: u8, } - } - #[must_use] - pub fn with_idx(mut self, idx: u8) -> Self { - self.in_idx = Some(idx); - self - } - - pub fn unnamed() -> Self { - Self { - edge_type: EdgeType::Unnamed, - in_idx: None, + impl Edge { + pub fn new(input_idx: u8) -> Self { + Self { input_idx } + } } - } -} -impl Default for Edge<'_> { - fn default() -> Self { - Self::unnamed() - } -} + impl Default for Edge { + fn default() -> Self { + Self { input_idx: 0 } + } + } -#[derive(Debug, Clone)] -pub enum EdgeType<'a> { - Named(&'a str), - /// For standard inputs such as SourceGraphic etc., which we'll just be representing as nodes for simplicity - Unnamed, -} - -fn create_input_attr<'w, 'b>( - g: &'_ DiGraph>, - mut el_writer: ElementWriter<'w, &'b mut Vec>, - node_idx: NodeIndex, - input_count: u8, -) -> ElementWriter<'w, &'b mut Vec> { - let inputs = g - .neighbors_directed(node_idx, petgraph::Direction::Incoming) - .collect::>(); - - if inputs.len() != input_count as usize { - // TODO: better error handling - panic!("input couns didnt match"); - } - - inputs - .into_iter() - .enumerate() - .fold(el_writer, |el_writer, (i, incoming_idx)| { - let incoming_node = g.node_weight(incoming_idx).expect("cannot fail here"); - - // find incoming edge and get weight - let Edge { edge_type, in_idx } = g - .edge_weight( - g.find_edge(incoming_idx, node_idx) - .expect("there should always be an edge"), - ) - .expect("once again, should always exist"); - - let in_attr_name = match in_idx { - None | Some(0) => "in".to_owned(), - Some(n) => format!("in{}", n + 1), - }; - - let v = match incoming_node { - Node::StdInput(std_in) => format!("{std_in:?}"), - Node::Primitive { .. } => { - if let EdgeType::Named(name) = edge_type { - (*name).to_owned() - } else { - panic!( - "unnamed edges should not be used for connections between primitives" - ) - } + impl ToString for Edge { + fn to_string(&self) -> String { + match self.input_idx { + 0 => "in".to_owned(), + n => format!("in{}", n + 1), } - }; - - el_writer.with_attribute((in_attr_name.as_str(), v.as_str())) - }) -} - -#[allow(clippy::unwrap_used, reason = "all unwraps are for finding on options")] -fn create_output_attr<'w, 'b>( - g: &'_ DiGraph>, - mut el_writer: ElementWriter<'w, &'b mut Vec>, - node_idx: NodeIndex, -) -> ElementWriter<'w, &'b mut Vec> { - let output = g - .neighbors_directed(node_idx, petgraph::Direction::Outgoing) - .map(|neighbor_idx| { - let edge_idx = g.find_edge(node_idx, neighbor_idx).unwrap(); - - let Edge { - edge_type: EdgeType::Named(name), - .. - } = g.edge_weight(edge_idx).unwrap() - else { - panic!("Unnamed edge used for connection between primitives"); - }; - *name - }) - .collect::>(); - - if output.is_empty() { - el_writer - } else if output.len() == 1 { - el_writer.with_attribute(Attribute { - key: QName(b"result"), - value: Cow::from( - (*output.into_iter().collect::>().first().unwrap()) - .to_string() - .into_bytes(), - ), - }) - } else { - panic!("Can't have more then one named output: {output:?}") + } + } } } diff --git a/crates/svg-filters/src/types/length.rs b/crates/svg-filters/src/types/length.rs index 1186181..10ddfcc 100644 --- a/crates/svg-filters/src/types/length.rs +++ b/crates/svg-filters/src/types/length.rs @@ -1,8 +1,17 @@ -#[derive(Default, Debug)] +use std::fmt::Display; + +#[derive(Default, Debug, Clone, Copy)] pub struct Length(f32, Unit); + +impl Display for Length { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}{}", self.0, self.1) + } +} + pub type Coordinate = Length; -#[derive(Default, Debug)] +#[derive(Default, Debug, Clone, Copy)] pub enum Unit { #[default] None, @@ -15,3 +24,19 @@ pub enum Unit { Pt, Pc, } + +impl Display for Unit { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Unit::None => f.write_str(""), + Unit::Em => f.write_str("em"), + Unit::Ex => f.write_str("ex"), + Unit::Px => f.write_str("px"), + Unit::In => f.write_str("in"), + Unit::Cm => f.write_str("cm"), + Unit::Mm => f.write_str("mm"), + Unit::Pt => f.write_str("pt"), + Unit::Pc => f.write_str("pc"), + } + } +} diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 63e041c..80cb5d0 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -34,12 +34,12 @@ impl Default for Node { } } -#[derive(Default, Debug)] +#[derive(Default, Debug, Clone, Copy)] pub(crate) struct CommonAttrs { - x: Coordinate, - y: Coordinate, - width: Length, - height: Length, + pub x: Coordinate, + pub y: Coordinate, + pub width: Length, + pub height: Length, } impl Node { @@ -50,6 +50,18 @@ impl Node { } } + pub fn primitive(&self) -> Option<(&FePrimitive, &CommonAttrs)> { + if let Node::Primitive { + primitive, + common_attrs, + } = self + { + Some((primitive, common_attrs)) + } else { + None + } + } + pub fn input_count(&self) -> u8 { match self { Node::Primitive { From bf60bdd81426536acb5fffac24d99f1c449e9a76 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 16 Mar 2024 23:57:09 +0100 Subject: [PATCH 086/189] svg-filters: simplify and refactor a bit --- crates/svg-filters/src/codegen.rs | 134 +++--------- crates/svg-filters/src/main.rs | 61 +++--- crates/svg-filters/src/types.rs | 66 +----- crates/svg-filters/src/types/graph.rs | 202 ++++++++++++++++++ crates/svg-filters/src/types/graph/edge.rs | 19 ++ crates/svg-filters/src/types/length.rs | 6 + crates/svg-filters/src/types/nodes.rs | 39 +++- .../svg-filters/src/types/nodes/primitives.rs | 36 +++- .../src/types/nodes/primitives/blend.rs | 46 ++++ .../types/nodes/primitives/color_matrix.rs | 12 +- .../src/types/nodes/primitives/flood.rs | 24 +++ .../src/types/nodes/primitives/morphology.rs | 34 +++ .../src/types/nodes/primitives/tile.rs | 12 ++ .../src/types/nodes/primitives/turbulence.rs | 66 +++++- .../src/types/nodes/standard_input.rs | 2 +- 15 files changed, 532 insertions(+), 227 deletions(-) create mode 100644 crates/svg-filters/src/types/graph.rs create mode 100644 crates/svg-filters/src/types/graph/edge.rs diff --git a/crates/svg-filters/src/codegen.rs b/crates/svg-filters/src/codegen.rs index ca0baa3..a8e7b23 100644 --- a/crates/svg-filters/src/codegen.rs +++ b/crates/svg-filters/src/codegen.rs @@ -1,7 +1,9 @@ use std::{ - borrow::Cow, cmp, - collections::{BTreeSet, HashMap, HashSet}, + collections::{BTreeSet, HashMap}, + fmt::Display, + io::Read, + ops::Not, }; use indexmap::IndexMap; @@ -10,11 +12,11 @@ use petgraph::{ graph::DiGraph, prelude::{EdgeIndex, NodeIndex}, }; -use quick_xml::{events::attributes::Attribute, name::QName, ElementWriter}; +use quick_xml::ElementWriter; use crate::{ types::{ - graph::{edge::Edge, FilterGraph}, + graph::{edge::Edge, FilterGraph, NodeInput}, nodes::{primitives::WriteElement, CommonAttrs}, }, Node, @@ -43,7 +45,7 @@ impl SvgDocument { pub fn generate_svg(&self) -> String { let mut result = Vec::new(); - let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 4); + let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 2); doc_writer .create_element("svg") @@ -82,121 +84,35 @@ impl SvgDocument { .map(|(primitive, common_attrs)| (node_idx, primitive, common_attrs)) }) .try_fold(writer, |writer, (node_idx, primitive, common_attrs)| { - let mut el_writer = primitive.element_writer(writer); - el_writer = input_attrs(node_idx, &graph.dag).write_into(el_writer); - el_writer = output_attrs(node_idx, &graph.dag).write_into(el_writer); - el_writer = Attrs::from(*common_attrs).write_into(el_writer); - el_writer.write_empty() + primitive.element_writer( + writer, + *common_attrs, + graph + .inputs(node_idx) + .into_iter() + .map(|v| v.to_string()) + .collect(), + graph + .outputs(node_idx) + .is_empty() + .not() + .then_some(format!("r{}", node_idx.index())), + ) })?; Ok(()) } } -struct Attrs(IndexMap); - -impl Attrs { - fn write_into<'w, 'b>( - self, - el_writer: ElementWriter<'w, &'b mut Vec>, - ) -> ElementWriter<'w, &'b mut Vec> { - let attrs = self.0.iter().map(|(k, v)| (k.as_str(), v.as_str())); - el_writer.with_attributes(attrs) - } -} - -impl From for Attrs { - fn from(value: CommonAttrs) -> Self { - let CommonAttrs { - x, - y, - width, - height, - } = value; - Self(IndexMap::from([ - ("x".to_owned(), x.to_string()), - ("y".to_owned(), y.to_string()), - ("width".to_owned(), width.to_string()), - ("height".to_owned(), height.to_string()), - ])) - } -} - -#[allow( - clippy::unwrap_used, - reason = "in all cases of use of unwrap, it's values we got from the graph so we know it's safe" -)] -fn input_attrs(node_idx: NodeIndex, g: &DiGraph) -> Attrs { - let inputs: Vec = g - .neighbors_directed(node_idx, petgraph::Direction::Incoming) - .collect(); - let node = g.node_weight(node_idx).unwrap(); - - if node.input_count() as usize != inputs.len() { - todo!("proper error handling for wrong numbers of inputs") - } - - let mut inputs = inputs - .into_iter() - .map(|input_idx| { - let edge_idx = g.find_edge(input_idx, node_idx).unwrap(); - let edge = g.edge_weight(edge_idx).unwrap(); - let input_node = g.node_weight(input_idx).unwrap(); - - (input_node, edge_idx, edge) - }) - .collect::>(); - inputs.sort_by(|a, b| a.2.cmp(b.2)); - - let mut uniq = BTreeSet::new(); - let no_duplicates = inputs.iter().all(|(_, _, edge)| uniq.insert(edge)); - - if no_duplicates { - Attrs( - inputs - .into_iter() - .map(|(input, edge_idx, edge)| { - let name = match input { - Node::StdInput(s) => format!("{s:?}"), - Node::Primitive { .. } => format_edge_idx(edge_idx), - }; - (edge.to_string(), name) - }) - .collect(), - ) - } else { - todo!("better error handling for inputs with multiple values") - } -} - -#[allow( - clippy::unwrap_used, - reason = "in all cases of use of unwrap, it's values we got from the graph so we know it's safe" -)] -fn output_attrs(node_idx: NodeIndex, g: &DiGraph) -> Attrs { - let outputs: Vec = g - .neighbors_directed(node_idx, petgraph::Direction::Outgoing) - .collect(); - - match outputs.len().cmp(&1) { - cmp::Ordering::Less => Attrs(IndexMap::new()), - cmp::Ordering::Equal => { - let output = outputs.first().unwrap(); - let edge_idx = g.find_edge(node_idx, *output).unwrap(); - Attrs(IndexMap::from([( - "result".to_string(), - format_edge_idx(edge_idx), - )])) - } - cmp::Ordering::Greater => todo!("better error handling for too many outputs"), - } -} - /// convenience method to avoid fuckups during future changes fn format_edge_idx(idx: EdgeIndex) -> String { format!("edge{}", idx.index()) } +fn format_node_idx(node_idx: NodeIndex) -> String { + format!("r{}", node_idx.index()) +} + mod error { use std::{error::Error, fmt::Display}; diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index 7caef27..c5684de 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -2,7 +2,10 @@ use std::hint::black_box; use svg_filters::{ codegen::SvgDocument, - types::{graph::edge::Edge, nodes::primitives::color_matrix::ColorMatrixType}, + types::{ + graph::edge::Edge, + nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, + }, Node, }; @@ -25,39 +28,33 @@ fn main() { let mut doc = SvgDocument::new(); let chromabb = doc.create_filter("chromabb_gen"); - let chan_r = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ - 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., - ])))); - let chan_g = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., - ])))); - let chan_b = chromabb.add_node(Node::color_matrix(ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., - ])))); + let chan_r = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + let offset_r = chromabb.offset(chan_r, 25., 0.); + let blur_r = chromabb.gaussian_blur_xy(offset_r, 5, 0); - let offset_r = chromabb.add_node(Node::offset(25., 0.)); - let offset_b = chromabb.add_node(Node::offset(-25., 0.)); - let blur_r = chromabb.add_node(Node::gaussian_blur_xy(5, 0)); - let blur_b = chromabb.add_node(Node::gaussian_blur_xy(5, 0)); + let chan_b = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + let offset_b = chromabb.offset(chan_b, -25., 0.); + let blur_b = chromabb.gaussian_blur_xy(offset_b, 5, 0); - let composite_rb = chromabb.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); - let composite_final = chromabb.add_node(Node::composite_arithmetic(0., 1., 1., 0.)); + let composite_rb = chromabb.composite_arithmetic(blur_r, blur_b, 0., 1., 1., 0.); - chromabb.dag.extend_with_edges(&[ - (chromabb.source_graphic(), chan_r), - (chromabb.source_graphic(), chan_b), - (chromabb.source_graphic(), chan_g), - (chan_r, offset_r), - (offset_r, blur_r), - (chan_b, offset_b), - (offset_b, blur_b), - ]); - chromabb.dag.extend_with_edges(&[ - (blur_r, composite_rb, Edge::new(0)), - (blur_b, composite_rb, Edge::new(1)), - (composite_rb, composite_final, Edge::new(0)), - (chan_g, composite_final, Edge::new(1)), - ]); + let chan_g = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + chromabb.composite_arithmetic(composite_rb, chan_g, 0., 1., 1., 0.); - black_box(doc.generate_svg()); + println!("{}", doc.generate_svg()); } diff --git a/crates/svg-filters/src/types.rs b/crates/svg-filters/src/types.rs index fa3941e..1290907 100644 --- a/crates/svg-filters/src/types.rs +++ b/crates/svg-filters/src/types.rs @@ -3,68 +3,4 @@ pub mod nodes; // pub mod old; -pub mod graph { - use std::iter::Iterator; - - use petgraph::{data::Build, prelude::*}; - - use crate::Node; - - use self::edge::Edge; - - use super::nodes::standard_input::StandardInput; - - #[derive(Debug)] - pub struct FilterGraph { - pub dag: DiGraph, - source_graphic_idx: NodeIndex, - } - - impl FilterGraph { - pub fn new() -> Self { - let mut dag = DiGraph::new(); - let source_graphic_idx = dag.add_node(Node::StdInput(StandardInput::SourceGraphic)); - - Self { - dag, - source_graphic_idx, - } - } - - pub fn add_node(&mut self, node: Node) -> NodeIndex { - self.dag.add_node(node) - } - - pub fn source_graphic(&self) -> NodeIndex { - self.source_graphic_idx - } - } - - pub mod edge { - #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] - pub struct Edge { - input_idx: u8, - } - - impl Edge { - pub fn new(input_idx: u8) -> Self { - Self { input_idx } - } - } - - impl Default for Edge { - fn default() -> Self { - Self { input_idx: 0 } - } - } - - impl ToString for Edge { - fn to_string(&self) -> String { - match self.input_idx { - 0 => "in".to_owned(), - n => format!("in{}", n + 1), - } - } - } - } -} +pub mod graph; diff --git a/crates/svg-filters/src/types/graph.rs b/crates/svg-filters/src/types/graph.rs new file mode 100644 index 0000000..44281d8 --- /dev/null +++ b/crates/svg-filters/src/types/graph.rs @@ -0,0 +1,202 @@ +use std::fmt::{Debug, Display}; + +use petgraph::{data::Build, prelude::NodeIndex, prelude::*, visit::IntoNeighborsDirected}; + +use crate::Node; + +use self::edge::Edge; + +use super::nodes::standard_input::StandardInput; + +#[derive(Debug)] +pub struct FilterGraph { + pub dag: DiGraph, + source_graphic_idx: NodeIndex, + source_alpha_idx: NodeIndex, + background_image_idx: NodeIndex, + background_alpha_idx: NodeIndex, + fill_paint_idx: NodeIndex, + stroke_paint_idx: NodeIndex, +} + +impl Default for FilterGraph { + fn default() -> Self { + Self::new() + } +} + +#[derive(Debug, Clone, Copy)] +pub enum NodeInput { + Standard(StandardInput), + Idx(NodeIndex), +} + +impl Display for NodeInput { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + NodeInput::Standard(s) => Debug::fmt(s, f), + NodeInput::Idx(idx) => write!(f, "r{}", idx.index()), + } + } +} + +impl From for NodeInput { + fn from(value: StandardInput) -> Self { + Self::Standard(value) + } +} + +impl From for NodeInput { + fn from(value: NodeIndex) -> Self { + Self::Idx(value) + } +} + +impl FilterGraph { + pub fn new() -> Self { + let mut dag = DiGraph::new(); + + let source_graphic_idx = dag.add_node(Node::StdInput(StandardInput::SourceGraphic)); + let source_alpha_idx = dag.add_node(Node::StdInput(StandardInput::SourceAlpha)); + let background_image_idx = dag.add_node(Node::StdInput(StandardInput::BackgroundImage)); + let background_alpha_idx = dag.add_node(Node::StdInput(StandardInput::BackgroundAlpha)); + let fill_paint_idx = dag.add_node(Node::StdInput(StandardInput::FillPaint)); + let stroke_paint_idx = dag.add_node(Node::StdInput(StandardInput::StrokePaint)); + + Self { + dag, + source_graphic_idx, + source_alpha_idx, + background_image_idx, + background_alpha_idx, + fill_paint_idx, + stroke_paint_idx, + } + } + + pub fn add_node(&mut self, node: Node) -> NodeIndex { + self.dag.add_node(node) + } + + fn resolve_input(&self, input: NodeInput) -> NodeIndex { + match input { + NodeInput::Standard(StandardInput::SourceGraphic) => self.source_graphic_idx, + NodeInput::Standard(StandardInput::SourceAlpha) => self.source_alpha_idx, + NodeInput::Standard(StandardInput::BackgroundImage) => self.background_image_idx, + NodeInput::Standard(StandardInput::BackgroundAlpha) => self.background_alpha_idx, + NodeInput::Standard(StandardInput::FillPaint) => self.fill_paint_idx, + NodeInput::Standard(StandardInput::StrokePaint) => self.stroke_paint_idx, + NodeInput::Idx(i) => i, + } + } + + #[allow( + clippy::unwrap_used, + reason = "we only operate on values we know exist, so unwrapping is safe" + )] + pub fn inputs(&self, node_idx: NodeIndex) -> Vec { + let mut inputs = self + .dag + .neighbors_directed(node_idx, Direction::Incoming) + .map(|input_idx| (self.dag.find_edge(input_idx, node_idx).unwrap(), input_idx)) + .collect::>(); + + inputs.sort_by(|(a, _), (b, _)| a.cmp(b)); + + inputs + .into_iter() + .map( + |(_, input_idx)| match self.dag.node_weight(input_idx).unwrap() { + Node::StdInput(s) => NodeInput::Standard(*s), + Node::Primitive { .. } => NodeInput::Idx(input_idx), + }, + ) + .collect() + } + + pub fn outputs(&self, node_idx: NodeIndex) -> Vec { + self.dag + .neighbors_directed(node_idx, Direction::Outgoing) + .collect() + } + + pub fn source_graphic(&self) -> NodeIndex { + self.source_graphic_idx + } + pub fn source_alpha(&self) -> NodeIndex { + self.source_alpha_idx + } + pub fn background_image(&self) -> NodeIndex { + self.background_image_idx + } + pub fn background_alpha(&self) -> NodeIndex { + self.background_alpha_idx + } + pub fn fill_paint(&self) -> NodeIndex { + self.fill_paint_idx + } + pub fn stroke_paint(&self) -> NodeIndex { + self.stroke_paint_idx + } +} + +pub mod abstracted_inputs { + use petgraph::{data::Build, prelude::NodeIndex}; + + use crate::{types::nodes::primitives::color_matrix::ColorMatrixType, Node}; + + use super::{FilterGraph, NodeInput}; + + impl FilterGraph { + pub fn color_matrix( + &mut self, + r#in: impl Into, + cm_type: ColorMatrixType, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::color_matrix(cm_type)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn offset(&mut self, r#in: impl Into, dx: f32, dy: f32) -> NodeIndex { + let node_idx = self.dag.add_node(Node::offset(dx, dy)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn gaussian_blur_xy( + &mut self, + r#in: impl Into, + x: u16, + y: u16, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::gaussian_blur_xy(x, y)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn composite_arithmetic( + &mut self, + r#in: impl Into, + in2: impl Into, + k1: f32, + k2: f32, + k3: f32, + k4: f32, + ) -> NodeIndex { + let node_idx = self + .dag + .add_node(Node::composite_arithmetic(k1, k2, k3, k4)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(in2.into()), node_idx, ()); + node_idx + } + } +} + +pub mod edge; diff --git a/crates/svg-filters/src/types/graph/edge.rs b/crates/svg-filters/src/types/graph/edge.rs new file mode 100644 index 0000000..0783a34 --- /dev/null +++ b/crates/svg-filters/src/types/graph/edge.rs @@ -0,0 +1,19 @@ +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)] +pub struct Edge { + input_idx: u8, +} + +impl Edge { + pub fn new(input_idx: u8) -> Self { + Self { input_idx } + } +} + +impl ToString for Edge { + fn to_string(&self) -> String { + match self.input_idx { + 0 => "in".to_owned(), + n => format!("in{}", n + 1), + } + } +} diff --git a/crates/svg-filters/src/types/length.rs b/crates/svg-filters/src/types/length.rs index 10ddfcc..ef9d2ef 100644 --- a/crates/svg-filters/src/types/length.rs +++ b/crates/svg-filters/src/types/length.rs @@ -3,6 +3,12 @@ use std::fmt::Display; #[derive(Default, Debug, Clone, Copy)] pub struct Length(f32, Unit); +impl Length { + pub fn is_zero(&self) -> bool { + self.0 == 0. + } +} + impl Display for Length { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}{}", self.0, self.1) diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 80cb5d0..b24251f 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -1,6 +1,6 @@ -use core::panic; +use std::borrow::Cow; -use quick_xml::events::attributes::Attribute; +use quick_xml::{events::attributes::Attribute, name::QName}; use self::{ primitives::{ @@ -42,6 +42,41 @@ pub(crate) struct CommonAttrs { pub height: Length, } +impl From for Vec> { + fn from(val: CommonAttrs) -> Self { + let mut r = Vec::new(); + if !val.x.is_zero() { + r.push(Attribute { + key: QName(b"x"), + value: Cow::from(val.x.to_string().into_bytes()), + }); + } + + if !val.y.is_zero() { + r.push(Attribute { + key: QName(b"y"), + value: Cow::from(val.y.to_string().into_bytes()), + }); + } + + if !val.width.is_zero() { + r.push(Attribute { + key: QName(b"width"), + value: Cow::from(val.width.to_string().into_bytes()), + }); + } + + if !val.height.is_zero() { + r.push(Attribute { + key: QName(b"height"), + value: Cow::from(val.height.to_string().into_bytes()), + }); + } + + r + } +} + impl Node { pub fn simple(el: FePrimitive) -> Node { Node::Primitive { diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 513f1a8..f43c820 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -1,10 +1,8 @@ +use std::convert::Into; + use quick_xml::{events::attributes::Attribute, ElementWriter, Writer}; -use crate::types::length::{Coordinate, Length}; - -use self::blend::BlendMode; - -use super::Node; +use super::CommonAttrs; pub mod blend; pub mod color_matrix; @@ -29,10 +27,34 @@ pub trait WriteElement { fn element_writer<'writer, 'result>( &self, writer: &'writer mut Writer<&'result mut Vec>, - ) -> ElementWriter<'writer, &'result mut Vec> { - writer + common: CommonAttrs, + inputs: Vec, + output: Option, + ) -> quick_xml::Result<&'writer mut quick_xml::Writer<&'result mut Vec>> { + let attrs: Vec<_> = inputs + .into_iter() + .enumerate() + .map(|(i, edge)| { + ( + match i { + 0 => "in".to_owned(), + n => format!("in{}", n + 1), + } + .into_bytes(), + edge.into_bytes(), + ) + }) + .collect(); + let mut el_writer = writer .create_element(self.tag_name()) + .with_attributes(Into::>>::into(common)) .with_attributes(self.attrs()) + .with_attributes(attrs.iter().map(|(k, v)| (&k[..], &v[..]))); + if let Some(output) = output { + el_writer = el_writer.with_attribute(("result", output.as_str())); + } + + el_writer.write_empty() } } diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs index 1aba6d0..8df8ad6 100644 --- a/crates/svg-filters/src/types/nodes/primitives/blend.rs +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -1,3 +1,9 @@ +use std::{borrow::Cow, fmt::Display}; + +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; + /// [feBlend](https://www.w3.org/TR/SVG11/filters.html#feBlendElement) #[derive(Debug)] pub struct Blend { @@ -18,6 +24,23 @@ impl Default for Blend { } } +impl WriteElement for Blend { + fn attrs(&self) -> Vec { + if let BlendMode::Normal = self.mode { + Vec::new() + } else { + vec![Attribute { + key: QName(b"mode"), + value: Cow::from(self.mode.to_string().into_bytes()), + }] + } + } + + fn tag_name(&self) -> &'static str { + "feBlend" + } +} + /// as according to https://drafts.fxtf.org/compositing-1/#blending #[derive(Debug)] pub enum BlendMode { @@ -39,3 +62,26 @@ pub enum BlendMode { Color, Luminosity, } + +impl Display for BlendMode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + BlendMode::Normal => "normal", + BlendMode::Multiply => "multiply", + BlendMode::Screen => "screen", + BlendMode::Overlay => "overlay", + BlendMode::Darken => "darken", + BlendMode::Lighten => "lighten", + BlendMode::ColorDodge => "color-dodge", + BlendMode::ColorBurn => "color-burn", + BlendMode::HardLight => "hard-light", + BlendMode::SoftLight => "soft-light", + BlendMode::Difference => "difference", + BlendMode::Exclusion => "exclusion", + BlendMode::Hue => "hue", + BlendMode::Saturation => "saturation", + BlendMode::Color => "color", + BlendMode::Luminosity => "luminosity", + }) + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs index ef32b60..4469500 100644 --- a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use quick_xml::{events::attributes::Attribute, name::QName, se::to_string}; +use quick_xml::{events::attributes::Attribute, name::QName}; use super::WriteElement; @@ -23,7 +23,7 @@ impl WriteElement for ColorMatrix { key: QName(b"values"), value: Cow::from( v.iter() - .map(|v| v.to_string()) + .map(std::string::ToString::to_string) .reduce(|mut acc, e| { acc.push(' '); acc.push_str(&e); @@ -33,9 +33,11 @@ impl WriteElement for ColorMatrix { .into_bytes(), ), }], - ColorMatrixType::Saturate(v) => todo!(), - ColorMatrixType::HueRotate(v) => todo!(), - ColorMatrixType::LuminanceToAlpha => todo!(), + ColorMatrixType::Saturate(v) | ColorMatrixType::HueRotate(v) => vec![Attribute { + key: QName(b"values"), + value: Cow::from(v.to_string().into_bytes()), + }], + ColorMatrixType::LuminanceToAlpha => Vec::new(), } } diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 94f6eee..3a90590 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -1,4 +1,9 @@ +use std::borrow::Cow; + use csscolorparser::Color; +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; /// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) #[derive(Debug)] @@ -6,3 +11,22 @@ pub struct Flood { flood_color: Color, flood_opacity: f32, } + +impl WriteElement for Flood { + fn attrs(&self) -> Vec { + vec![ + Attribute { + key: QName(b"flood-color"), + value: Cow::from(self.flood_color.to_hex_string().into_bytes()), + }, + Attribute { + key: QName(b"flood-opacity"), + value: Cow::from(self.flood_opacity.to_string().into_bytes()), + }, + ] + } + + fn tag_name(&self) -> &'static str { + "feFlood" + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/morphology.rs b/crates/svg-filters/src/types/nodes/primitives/morphology.rs index 6b33825..dc11775 100644 --- a/crates/svg-filters/src/types/nodes/primitives/morphology.rs +++ b/crates/svg-filters/src/types/nodes/primitives/morphology.rs @@ -1,3 +1,9 @@ +use std::{borrow::Cow, fmt::Display}; + +use quick_xml::{events::attributes::Attribute, name::QName}; + +use super::WriteElement; + /// [feMorphology](https://www.w3.org/TR/SVG11/filters.html#feMorphologyElement) #[derive(Debug)] pub struct Morphology { @@ -5,8 +11,36 @@ pub struct Morphology { radius: (f32, f32), } +impl WriteElement for Morphology { + fn attrs(&self) -> Vec { + vec![ + Attribute { + key: QName(b"operator"), + value: Cow::from(self.operator.to_string().into_bytes()), + }, + Attribute { + key: QName(b"radius"), + value: Cow::from(format!("{} {}", self.radius.0, self.radius.1).into_bytes()), + }, + ] + } + + fn tag_name(&self) -> &'static str { + "feMorphology" + } +} + #[derive(Debug)] enum Operator { Erode, Dilate, } + +impl Display for Operator { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + Operator::Erode => "erode", + Operator::Dilate => "dilate", + }) + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/tile.rs b/crates/svg-filters/src/types/nodes/primitives/tile.rs index 7a957c5..d83b65f 100644 --- a/crates/svg-filters/src/types/nodes/primitives/tile.rs +++ b/crates/svg-filters/src/types/nodes/primitives/tile.rs @@ -1,3 +1,15 @@ +use super::WriteElement; + /// [feTile](https://www.w3.org/TR/SVG11/filters.html#feTileElement) #[derive(Debug)] pub struct Tile; + +impl WriteElement for Tile { + fn attrs(&self) -> Vec { + Vec::new() + } + + fn tag_name(&self) -> &'static str { + "feTile" + } +} diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs index ec815cb..8bdcab0 100644 --- a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -1,21 +1,75 @@ +use std::borrow::Cow; + +use quick_xml::{ + events::attributes::{Attr, Attribute}, + name::QName, +}; + +use super::WriteElement; + /// [feTurbulence](https://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement) #[derive(Debug)] pub struct Turbulence { base_frequency: (f32, f32), - num_octaves: (u16), + num_octaves: u16, seed: u32, - stich_tiles: StitchTiles, + stitch_tiles: StitchTiles, // attr name: type noise_type: NoiseType, } -#[derive(Debug)] -enum StitchTiles { +impl WriteElement for Turbulence { + fn attrs(&self) -> Vec { + let mut r = Vec::from([Attribute { + key: QName(b"baseFrequency"), + value: Cow::from( + format!("{} {}", self.base_frequency.0, self.base_frequency.1).into_bytes(), + ), + }]); + + if self.num_octaves != 1 { + r.push(Attribute { + key: QName(b"numOctaves"), + value: Cow::from(format!("{}", self.num_octaves).into_bytes()), + }); + } + + if self.seed != 0 { + r.push(Attribute { + key: QName(b"seed"), + value: Cow::from(self.seed.to_string().into_bytes()), + }); + } + + if self.stitch_tiles != StitchTiles::NoStitch { + r.push(Attribute { + key: QName(b"stitchTiles"), + value: Cow::from(b"stitch".to_vec()), + }); + } + + if self.noise_type != NoiseType::Turbulence { + r.push(Attribute { + key: QName(b"type"), + value: Cow::from(b"fractalNoise".to_vec()), + }); + } + + r + } + + fn tag_name(&self) -> &'static str { + "feTurbulence" + } +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum StitchTiles { Stitch, NoStitch, } -#[derive(Debug)] -enum NoiseType { +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum NoiseType { Turbulence, FractalNoise, } diff --git a/crates/svg-filters/src/types/nodes/standard_input.rs b/crates/svg-filters/src/types/nodes/standard_input.rs index add10d0..3004e19 100644 --- a/crates/svg-filters/src/types/nodes/standard_input.rs +++ b/crates/svg-filters/src/types/nodes/standard_input.rs @@ -1,6 +1,6 @@ /// [svg filter effect standard input](https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveInAttribute) /// technically not a node, but for implementation simplicity... yeah -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub enum StandardInput { SourceGraphic, SourceAlpha, From d87033d32024845534e414f060a0d007ee85d3b5 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 17 Mar 2024 00:49:53 +0100 Subject: [PATCH 087/189] svg-filters(codegen): add pretty and ugly printing --- crates/svg-filters/src/codegen.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/svg-filters/src/codegen.rs b/crates/svg-filters/src/codegen.rs index a8e7b23..cd93d25 100644 --- a/crates/svg-filters/src/codegen.rs +++ b/crates/svg-filters/src/codegen.rs @@ -43,10 +43,25 @@ impl SvgDocument { self.filters.get_mut(&id.to_string()).unwrap() } + pub fn generate_svg_pretty(&self) -> String { + let mut result = Vec::new(); + let doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 2); + + self.generate(doc_writer); + + String::from_utf8_lossy(&result).to_string() + } + pub fn generate_svg(&self) -> String { let mut result = Vec::new(); - let mut doc_writer = quick_xml::Writer::new_with_indent(&mut result, b' ', 2); + let doc_writer = quick_xml::Writer::new(&mut result); + self.generate(doc_writer); + + String::from_utf8_lossy(&result).to_string() + } + + fn generate(&self, mut doc_writer: quick_xml::Writer<&mut Vec>) { doc_writer .create_element("svg") .write_inner_content(|writer| { @@ -55,8 +70,6 @@ impl SvgDocument { .try_fold(writer, Self::gen_filter) .map(|_| {}) }); - - String::from_utf8_lossy(&result).to_string() } fn gen_filter<'w, 'r>( From 77bcb54b5eefa2e345f0e81d1ccb8b608a2c3b9c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 17 Mar 2024 00:50:16 +0100 Subject: [PATCH 088/189] svg-filters(tests): start --- crates/svg-filters/src/lib.rs | 2 +- crates/svg-filters/src/tests.rs | 19 +++++++++ crates/svg-filters/src/tests/color_matrix.rs | 25 +++++++++++ crates/svg-filters/src/tests/complex.rs | 42 +++++++++++++++++++ crates/svg-filters/src/tests/gaussian_blur.rs | 13 ++++++ crates/svg-filters/src/tests/offset.rs | 14 +++++++ 6 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 crates/svg-filters/src/tests.rs create mode 100644 crates/svg-filters/src/tests/color_matrix.rs create mode 100644 crates/svg-filters/src/tests/complex.rs create mode 100644 crates/svg-filters/src/tests/gaussian_blur.rs create mode 100644 crates/svg-filters/src/tests/offset.rs diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index cc443d8..c3ddedc 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -5,4 +5,4 @@ pub mod types; pub use types::nodes::Node; #[cfg(test)] -mod tests {} +mod tests; diff --git a/crates/svg-filters/src/tests.rs b/crates/svg-filters/src/tests.rs new file mode 100644 index 0000000..c09a957 --- /dev/null +++ b/crates/svg-filters/src/tests.rs @@ -0,0 +1,19 @@ +mod color_matrix; + +mod complex; +mod gaussian_blur; +mod offset; + +mod blend {} +mod component_transfer {} +mod composite {} +mod convolve_matrix {} +mod diffuse_lighting {} +mod displacement_map {} +mod flood {} +mod image {} +mod merge {} +mod morphology {} +mod specular_lighting {} +mod tile {} +mod turbulence {} diff --git a/crates/svg-filters/src/tests/color_matrix.rs b/crates/svg-filters/src/tests/color_matrix.rs new file mode 100644 index 0000000..e32d507 --- /dev/null +++ b/crates/svg-filters/src/tests/color_matrix.rs @@ -0,0 +1,25 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, +}; + +#[test] +fn test_greyscale_channel_extraction() { + let mut doc = SvgDocument::new(); + let greyscale = doc.create_filter("greyscale"); + + greyscale.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., // + 1., 0., 0., 0., 0., // + 1., 0., 0., 0., 0., // + 0., 0., 0., 1., 0., + ])), + ); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/complex.rs b/crates/svg-filters/src/tests/complex.rs new file mode 100644 index 0000000..9b28304 --- /dev/null +++ b/crates/svg-filters/src/tests/complex.rs @@ -0,0 +1,42 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, +}; + +#[test] +fn test_chrom_abb() { + let mut doc = SvgDocument::new(); + let chromabb = doc.create_filter("chromabb_gen"); + + let chan_r = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + let offset_r = chromabb.offset(chan_r, 25., 0.); + let blur_r = chromabb.gaussian_blur_xy(offset_r, 5, 0); + + let chan_b = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + let offset_b = chromabb.offset(chan_b, -25., 0.); + let blur_b = chromabb.gaussian_blur_xy(offset_b, 5, 0); + + let composite_rb = chromabb.composite_arithmetic(blur_r, blur_b, 0., 1., 1., 0.); + + let chan_g = chromabb.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + ])), + ); + chromabb.composite_arithmetic(composite_rb, chan_g, 0., 1., 1., 0.); + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/gaussian_blur.rs b/crates/svg-filters/src/tests/gaussian_blur.rs new file mode 100644 index 0000000..5739794 --- /dev/null +++ b/crates/svg-filters/src/tests/gaussian_blur.rs @@ -0,0 +1,13 @@ +use crate::{codegen::SvgDocument, types::nodes::standard_input::StandardInput}; + +#[test] +fn test_simple_blur() { + let mut doc = SvgDocument::new(); + let blur = doc.create_filter("blur"); + + blur.gaussian_blur_xy(StandardInput::SourceGraphic, 30, 30); + assert_eq!( + doc.generate_svg(), + r#""# + ) +} diff --git a/crates/svg-filters/src/tests/offset.rs b/crates/svg-filters/src/tests/offset.rs new file mode 100644 index 0000000..4d7319e --- /dev/null +++ b/crates/svg-filters/src/tests/offset.rs @@ -0,0 +1,14 @@ +use crate::{codegen::SvgDocument, types::nodes::standard_input::StandardInput}; + +#[test] +fn test_offset_simple() { + let mut doc = SvgDocument::new(); + let mut offset = doc.create_filter("offset"); + + offset.offset(StandardInput::SourceGraphic, 25., -25.); + + assert_eq!( + doc.generate_svg(), + r#""# + ) +} From 384fef5a816854f52572b18bf010dc3b8894b2ef Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 17 Mar 2024 00:50:51 +0100 Subject: [PATCH 089/189] svg-filters(primitives): start with feComponentTransfer --- crates/svg-filters/src/types/nodes.rs | 19 ++++++++++++++++--- .../nodes/primitives/component_transfer.rs | 10 +++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index b24251f..a1ca752 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -6,6 +6,7 @@ use self::{ primitives::{ blend::{Blend, BlendMode}, color_matrix::{ColorMatrix, ColorMatrixType}, + component_transfer::{ComponentTransfer, TransferFn}, composite::{Composite, CompositeOperator}, gaussian_blur::GaussianBlur, offset::Offset, @@ -145,9 +146,7 @@ impl Node { } pub fn composite_arithmetic(k1: f32, k2: f32, k3: f32, k4: f32) -> Self { - Self::simple(FePrimitive::Composite(Composite::arithmetic( - k1, k2, k3, k4, - ))) + Self::composite(CompositeOperator::Arithmetic { k1, k2, k3, k4 }) } pub fn gaussian_blur(v: u16) -> Self { @@ -161,4 +160,18 @@ impl Node { pub fn offset(dx: f32, dy: f32) -> Self { Self::simple(FePrimitive::Offset(Offset::new(dx, dy))) } + + pub fn component_transfer_rgba( + r: TransferFn, + g: TransferFn, + b: TransferFn, + a: TransferFn, + ) -> Self { + Self::simple(FePrimitive::ComponentTransfer(ComponentTransfer { + func_r: r, + func_g: g, + func_b: b, + func_a: a, + })) + } } diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs index 3ccc039..abfd5a0 100644 --- a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -1,15 +1,15 @@ /// [feComponentTransfer](https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement) #[derive(Debug)] pub struct ComponentTransfer { - func_r: TransferFunction, - func_g: TransferFunction, - func_b: TransferFunction, - func_a: TransferFunction, + pub func_r: TransferFn, + pub func_g: TransferFn, + pub func_b: TransferFn, + pub func_a: TransferFn, } /// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) #[derive(Debug)] -enum TransferFunction { +pub enum TransferFn { Identity, Table { table_values: Vec, From f59062cf88685f5e7847b8b09361d55ed41c25b3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 17 Mar 2024 00:51:20 +0100 Subject: [PATCH 090/189] svg-filters: cleanup --- crates/svg-filters/src/main.rs | 45 +------------------ .../svg-filters/src/types/nodes/primitives.rs | 1 - 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index c5684de..aff0c94 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -10,51 +10,8 @@ use svg_filters::{ }; fn main() { - // - // - // - // - - // - - // - // - // - - // - // - // - let mut doc = SvgDocument::new(); - let chromabb = doc.create_filter("chromabb_gen"); - - let chan_r = chromabb.color_matrix( - StandardInput::SourceGraphic, - ColorMatrixType::Matrix(Box::new([ - 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., - ])), - ); - let offset_r = chromabb.offset(chan_r, 25., 0.); - let blur_r = chromabb.gaussian_blur_xy(offset_r, 5, 0); - - let chan_b = chromabb.color_matrix( - StandardInput::SourceGraphic, - ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., - ])), - ); - let offset_b = chromabb.offset(chan_b, -25., 0.); - let blur_b = chromabb.gaussian_blur_xy(offset_b, 5, 0); - - let composite_rb = chromabb.composite_arithmetic(blur_r, blur_b, 0., 1., 1., 0.); - - let chan_g = chromabb.color_matrix( - StandardInput::SourceGraphic, - ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., - ])), - ); - chromabb.composite_arithmetic(composite_rb, chan_g, 0., 1., 1., 0.); + eprintln!("{}", doc.generate_svg_pretty()); println!("{}", doc.generate_svg()); } diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index f43c820..c7526fd 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -61,7 +61,6 @@ pub trait WriteElement { /// svg filter effects primitives #[derive(Debug)] pub enum FePrimitive { - // 2 inputs Blend(blend::Blend), ColorMatrix(color_matrix::ColorMatrix), ComponentTransfer(component_transfer::ComponentTransfer), From e17fffb66b87aad7f3ad8cc98ac3ab65a21f1be9 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 19 Mar 2024 15:15:36 +0100 Subject: [PATCH 091/189] svg-filters: blend node --- crates/svg-filters/src/tests.rs | 2 +- crates/svg-filters/src/tests/blend.rs | 20 +++++++++++++++ crates/svg-filters/src/tests/gaussian_blur.rs | 2 +- crates/svg-filters/src/tests/offset.rs | 4 +-- crates/svg-filters/src/types/graph.rs | 25 +++++++++++++++---- .../svg-filters/src/types/nodes/primitives.rs | 4 +-- 6 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 crates/svg-filters/src/tests/blend.rs diff --git a/crates/svg-filters/src/tests.rs b/crates/svg-filters/src/tests.rs index c09a957..72b970f 100644 --- a/crates/svg-filters/src/tests.rs +++ b/crates/svg-filters/src/tests.rs @@ -1,10 +1,10 @@ mod color_matrix; +mod blend; mod complex; mod gaussian_blur; mod offset; -mod blend {} mod component_transfer {} mod composite {} mod convolve_matrix {} diff --git a/crates/svg-filters/src/tests/blend.rs b/crates/svg-filters/src/tests/blend.rs new file mode 100644 index 0000000..71aea21 --- /dev/null +++ b/crates/svg-filters/src/tests/blend.rs @@ -0,0 +1,20 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::{primitives::blend::BlendMode, standard_input::StandardInput}, +}; + +#[test] +fn test_offset_blend() { + let mut doc = SvgDocument::new(); + + let blend = doc.create_filter("blend"); + + let offset0 = blend.offset(StandardInput::SourceGraphic, 100., 0.); + let offset1 = blend.offset(StandardInput::SourceGraphic, -100., 0.); + blend.blend(offset0, offset1, BlendMode::Multiply); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/gaussian_blur.rs b/crates/svg-filters/src/tests/gaussian_blur.rs index 5739794..f148684 100644 --- a/crates/svg-filters/src/tests/gaussian_blur.rs +++ b/crates/svg-filters/src/tests/gaussian_blur.rs @@ -9,5 +9,5 @@ fn test_simple_blur() { assert_eq!( doc.generate_svg(), r#""# - ) + ); } diff --git a/crates/svg-filters/src/tests/offset.rs b/crates/svg-filters/src/tests/offset.rs index 4d7319e..380170e 100644 --- a/crates/svg-filters/src/tests/offset.rs +++ b/crates/svg-filters/src/tests/offset.rs @@ -3,12 +3,12 @@ use crate::{codegen::SvgDocument, types::nodes::standard_input::StandardInput}; #[test] fn test_offset_simple() { let mut doc = SvgDocument::new(); - let mut offset = doc.create_filter("offset"); + let offset = doc.create_filter("offset"); offset.offset(StandardInput::SourceGraphic, 25., -25.); assert_eq!( doc.generate_svg(), r#""# - ) + ); } diff --git a/crates/svg-filters/src/types/graph.rs b/crates/svg-filters/src/types/graph.rs index 44281d8..05d63c3 100644 --- a/crates/svg-filters/src/types/graph.rs +++ b/crates/svg-filters/src/types/graph.rs @@ -1,11 +1,9 @@ use std::fmt::{Debug, Display}; -use petgraph::{data::Build, prelude::NodeIndex, prelude::*, visit::IntoNeighborsDirected}; +use petgraph::{prelude::NodeIndex, prelude::*}; use crate::Node; -use self::edge::Edge; - use super::nodes::standard_input::StandardInput; #[derive(Debug)] @@ -141,9 +139,12 @@ impl FilterGraph { } pub mod abstracted_inputs { - use petgraph::{data::Build, prelude::NodeIndex}; + use petgraph::prelude::NodeIndex; - use crate::{types::nodes::primitives::color_matrix::ColorMatrixType, Node}; + use crate::{ + types::nodes::primitives::{blend::BlendMode, color_matrix::ColorMatrixType}, + Node, + }; use super::{FilterGraph, NodeInput}; @@ -178,6 +179,20 @@ pub mod abstracted_inputs { node_idx } + pub fn blend( + &mut self, + r#in: impl Into, + in2: impl Into, + mode: BlendMode, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::blend(mode)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(in2.into()), node_idx, ()); + node_idx + } + pub fn composite_arithmetic( &mut self, r#in: impl Into, diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index c7526fd..7ba1c2d 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -82,7 +82,7 @@ pub enum FePrimitive { impl WriteElement for FePrimitive { fn attrs(&self) -> std::vec::Vec> { match self { - FePrimitive::Blend(_) => todo!(), + FePrimitive::Blend(el) => el.attrs(), FePrimitive::ColorMatrix(el) => el.attrs(), FePrimitive::ComponentTransfer(_) => todo!(), FePrimitive::Composite(el) => el.attrs(), @@ -103,7 +103,7 @@ impl WriteElement for FePrimitive { fn tag_name(&self) -> &'static str { match self { - FePrimitive::Blend(_) => todo!(), + FePrimitive::Blend(el) => el.tag_name(), FePrimitive::ColorMatrix(el) => el.tag_name(), FePrimitive::ComponentTransfer(_) => todo!(), FePrimitive::Composite(el) => el.tag_name(), From dc7d76dc264dd0446c4c0eb85da240faa5f79916 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 19 Mar 2024 15:47:09 +0100 Subject: [PATCH 092/189] svg-filters: create `gen_attr` and `gen_attrs` convenience macros --- crates/svg-filters/src/main.rs | 11 ++++- crates/svg-filters/src/types/nodes.rs | 2 +- .../svg-filters/src/types/nodes/primitives.rs | 17 ++++++++ .../src/types/nodes/primitives/blend.rs | 5 +-- .../types/nodes/primitives/color_matrix.rs | 36 +++++++---------- .../nodes/primitives/component_transfer.rs | 12 ++++++ .../src/types/nodes/primitives/composite.rs | 40 +++++++++++-------- .../src/types/nodes/primitives/flood.rs | 12 ++---- .../types/nodes/primitives/gaussian_blur.rs | 7 +--- .../src/types/nodes/primitives/morphology.rs | 12 ++---- .../src/types/nodes/primitives/offset.rs | 11 +---- .../src/types/nodes/primitives/turbulence.rs | 37 ++++------------- 12 files changed, 94 insertions(+), 108 deletions(-) diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index aff0c94..1bf86c8 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -4,7 +4,10 @@ use svg_filters::{ codegen::SvgDocument, types::{ graph::edge::Edge, - nodes::{primitives::color_matrix::ColorMatrixType, standard_input::StandardInput}, + nodes::{ + primitives::{blend::BlendMode, color_matrix::ColorMatrixType}, + standard_input::StandardInput, + }, }, Node, }; @@ -12,6 +15,12 @@ use svg_filters::{ fn main() { let mut doc = SvgDocument::new(); + let blend = doc.create_filter("blend"); + + let offset0 = blend.offset(StandardInput::SourceGraphic, 100., 0.); + let offset1 = blend.offset(StandardInput::SourceGraphic, -100., 0.); + blend.blend(offset0, offset1, BlendMode::Multiply); + eprintln!("{}", doc.generate_svg_pretty()); println!("{}", doc.generate_svg()); } diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index a1ca752..656574d 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -36,7 +36,7 @@ impl Default for Node { } #[derive(Default, Debug, Clone, Copy)] -pub(crate) struct CommonAttrs { +pub struct CommonAttrs { pub x: Coordinate, pub y: Coordinate, pub width: Length, diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 7ba1c2d..a596639 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -4,6 +4,23 @@ use quick_xml::{events::attributes::Attribute, ElementWriter, Writer}; use super::CommonAttrs; +macro_rules! gen_attr { + ($name:literal = $out:expr) => { + quick_xml::events::attributes::Attribute { + key: quick_xml::name::QName($name), + value: std::borrow::Cow::from(($out).to_string().into_bytes()), + } + }; +} + +macro_rules! gen_attrs { + ($($name:literal = $out:expr),+) => { + vec![ + $(gen_attr!($name = $out)),+ + ] + }; +} + pub mod blend; pub mod color_matrix; pub mod component_transfer; diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs index 8df8ad6..1887042 100644 --- a/crates/svg-filters/src/types/nodes/primitives/blend.rs +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -29,10 +29,7 @@ impl WriteElement for Blend { if let BlendMode::Normal = self.mode { Vec::new() } else { - vec![Attribute { - key: QName(b"mode"), - value: Cow::from(self.mode.to_string().into_bytes()), - }] + gen_attrs![b"mode" = self.mode] } } diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs index 4469500..31e4130 100644 --- a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -1,7 +1,3 @@ -use std::borrow::Cow; - -use quick_xml::{events::attributes::Attribute, name::QName}; - use super::WriteElement; /// [feColorMatrix](https://www.w3.org/TR/SVG11/filters.html#feColorMatrixElement) @@ -19,24 +15,20 @@ impl ColorMatrix { impl WriteElement for ColorMatrix { fn attrs(&self) -> Vec { match &self.cm_type { - ColorMatrixType::Matrix(v) => vec![Attribute { - key: QName(b"values"), - value: Cow::from( - v.iter() - .map(std::string::ToString::to_string) - .reduce(|mut acc, e| { - acc.push(' '); - acc.push_str(&e); - acc - }) - .expect("Should be able to concatenate the thingies") - .into_bytes(), - ), - }], - ColorMatrixType::Saturate(v) | ColorMatrixType::HueRotate(v) => vec![Attribute { - key: QName(b"values"), - value: Cow::from(v.to_string().into_bytes()), - }], + ColorMatrixType::Matrix(v) => gen_attrs![ + b"values" = v + .iter() + .map(std::string::ToString::to_string) + .reduce(|mut acc, e| { + acc.push(' '); + acc.push_str(&e); + acc + }) + .expect("fixed length arr should always work") + ], + ColorMatrixType::Saturate(v) | ColorMatrixType::HueRotate(v) => { + gen_attrs![b"values" = v] + } ColorMatrixType::LuminanceToAlpha => Vec::new(), } } diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs index abfd5a0..d495ecc 100644 --- a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -1,3 +1,5 @@ +use super::WriteElement; + /// [feComponentTransfer](https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement) #[derive(Debug)] pub struct ComponentTransfer { @@ -7,6 +9,16 @@ pub struct ComponentTransfer { pub func_a: TransferFn, } +impl WriteElement for ComponentTransfer { + fn attrs(&self) -> Vec { + Vec::new() + } + + fn tag_name(&self) -> &'static str { + "feComponentTransfer" + } +} + /// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) #[derive(Debug)] pub enum TransferFn { diff --git a/crates/svg-filters/src/types/nodes/primitives/composite.rs b/crates/svg-filters/src/types/nodes/primitives/composite.rs index e27664d..b877fe8 100644 --- a/crates/svg-filters/src/types/nodes/primitives/composite.rs +++ b/crates/svg-filters/src/types/nodes/primitives/composite.rs @@ -51,23 +51,29 @@ impl WriteElement for Composite { }]; if let Some([k1, k2, k3, k4]) = vals { - r.append(&mut vec![ - Attribute { - key: QName(b"k1"), - value: Cow::from(k1.to_string().into_bytes()), - }, - Attribute { - key: QName(b"k2"), - value: Cow::from(k2.to_string().into_bytes()), - }, - Attribute { - key: QName(b"k3"), - value: Cow::from(k3.to_string().into_bytes()), - }, - Attribute { - key: QName(b"k4"), - value: Cow::from(k4.to_string().into_bytes()), - }, + // r.append(&mut vec![ + // Attribute { + // key: QName(b"k1"), + // value: Cow::from(k1.to_string().into_bytes()), + // }, + // Attribute { + // key: QName(b"k2"), + // value: Cow::from(k2.to_string().into_bytes()), + // }, + // Attribute { + // key: QName(b"k3"), + // value: Cow::from(k3.to_string().into_bytes()), + // }, + // Attribute { + // key: QName(b"k4"), + // value: Cow::from(k4.to_string().into_bytes()), + // }, + // ]); + r.append(&mut gen_attrs![ + b"k1" = k1, + b"k2" = k2, + b"k3" = k3, + b"k4" = k4 ]); } diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 3a90590..3342ef7 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -14,15 +14,9 @@ pub struct Flood { impl WriteElement for Flood { fn attrs(&self) -> Vec { - vec![ - Attribute { - key: QName(b"flood-color"), - value: Cow::from(self.flood_color.to_hex_string().into_bytes()), - }, - Attribute { - key: QName(b"flood-opacity"), - value: Cow::from(self.flood_opacity.to_string().into_bytes()), - }, + gen_attrs![ + b"flood-color" = self.flood_color.to_hex_string(), + b"flood-opacity" = self.flood_opacity ] } diff --git a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs index a0c42bd..e255df4 100644 --- a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs +++ b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs @@ -26,12 +26,7 @@ impl GaussianBlur { impl WriteElement for GaussianBlur { fn attrs(&self) -> Vec { - vec![Attribute { - key: QName(b"stdDeviation"), - value: Cow::from( - format!("{} {}", self.std_deviation.0, self.std_deviation.1).into_bytes(), - ), - }] + gen_attrs![b"stdDeviation" = format!("{} {}", self.std_deviation.0, self.std_deviation.1)] } fn tag_name(&self) -> &'static str { diff --git a/crates/svg-filters/src/types/nodes/primitives/morphology.rs b/crates/svg-filters/src/types/nodes/primitives/morphology.rs index dc11775..f9087d6 100644 --- a/crates/svg-filters/src/types/nodes/primitives/morphology.rs +++ b/crates/svg-filters/src/types/nodes/primitives/morphology.rs @@ -13,15 +13,9 @@ pub struct Morphology { impl WriteElement for Morphology { fn attrs(&self) -> Vec { - vec![ - Attribute { - key: QName(b"operator"), - value: Cow::from(self.operator.to_string().into_bytes()), - }, - Attribute { - key: QName(b"radius"), - value: Cow::from(format!("{} {}", self.radius.0, self.radius.1).into_bytes()), - }, + gen_attrs![ + b"operator" = self.operator, + b"radius" = format!("{} {}", self.radius.0, self.radius.1) ] } diff --git a/crates/svg-filters/src/types/nodes/primitives/offset.rs b/crates/svg-filters/src/types/nodes/primitives/offset.rs index 4cad35b..fa17dca 100644 --- a/crates/svg-filters/src/types/nodes/primitives/offset.rs +++ b/crates/svg-filters/src/types/nodes/primitives/offset.rs @@ -19,16 +19,7 @@ impl Offset { impl WriteElement for Offset { fn attrs(&self) -> Vec { - vec![ - Attribute { - key: QName(b"dx"), - value: Cow::from(self.dx.to_string().into_bytes()), - }, - Attribute { - key: QName(b"dy"), - value: Cow::from(self.dy.to_string().into_bytes()), - }, - ] + gen_attrs![b"dx" = self.dx, b"dy" = self.dy] } fn tag_name(&self) -> &'static str { diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs index 8bdcab0..d538006 100644 --- a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -1,10 +1,3 @@ -use std::borrow::Cow; - -use quick_xml::{ - events::attributes::{Attr, Attribute}, - name::QName, -}; - use super::WriteElement; /// [feTurbulence](https://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement) @@ -19,40 +12,26 @@ pub struct Turbulence { } impl WriteElement for Turbulence { + #[allow(clippy::str_to_string, reason = "in macro invocation")] fn attrs(&self) -> Vec { - let mut r = Vec::from([Attribute { - key: QName(b"baseFrequency"), - value: Cow::from( - format!("{} {}", self.base_frequency.0, self.base_frequency.1).into_bytes(), - ), - }]); + let mut r = gen_attrs!( + b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1) + ); if self.num_octaves != 1 { - r.push(Attribute { - key: QName(b"numOctaves"), - value: Cow::from(format!("{}", self.num_octaves).into_bytes()), - }); + r.push(gen_attr!(b"numOctaves" = self.num_octaves)); } if self.seed != 0 { - r.push(Attribute { - key: QName(b"seed"), - value: Cow::from(self.seed.to_string().into_bytes()), - }); + r.push(gen_attr!(b"seed" = self.seed)); } if self.stitch_tiles != StitchTiles::NoStitch { - r.push(Attribute { - key: QName(b"stitchTiles"), - value: Cow::from(b"stitch".to_vec()), - }); + r.push(gen_attr!(b"stitchTiles" = "stitch")); } if self.noise_type != NoiseType::Turbulence { - r.push(Attribute { - key: QName(b"type"), - value: Cow::from(b"fractalNoise".to_vec()), - }); + r.push(gen_attr!(b"type" = "fractalNoise")); } r From aeeee54200d126aeaa850878fe3ca406684242e6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 19 Mar 2024 18:43:30 +0100 Subject: [PATCH 093/189] svg-filters: new conditional attrs macro --- crates/svg-filters/src/lib.rs | 32 ++++++++++++ .../svg-filters/src/types/nodes/primitives.rs | 21 +------- .../src/types/nodes/primitives/turbulence.rs | 49 ++++++++++--------- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index c3ddedc..e1e0272 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -1,5 +1,37 @@ #![feature(lint_reasons)] +#[macro_use] +pub mod util { + macro_rules! gen_attr { + ($name:literal = $out:expr) => { + quick_xml::events::attributes::Attribute { + key: quick_xml::name::QName($name), + value: std::borrow::Cow::from(($out).to_string().into_bytes()), + } + }; + } + + macro_rules! gen_attrs { + ($($name:literal = $out:expr),+) => { + vec![ + $(gen_attr!($name = $out)),+ + ] + }; + } + + macro_rules! gen_attrs_with_conds { + ($($name:literal = $out:expr),+, $($cond:expr => $name_:literal = $out_:expr),+) => { + { + let mut r = gen_attrs![$($name = $out),+]; + $(if $cond { + r.push(gen_attr!($name_ = $out_)); + })+ + r + } + }; + } +} + pub mod codegen; pub mod types; pub use types::nodes::Node; diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index a596639..f3c101a 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -4,23 +4,6 @@ use quick_xml::{events::attributes::Attribute, ElementWriter, Writer}; use super::CommonAttrs; -macro_rules! gen_attr { - ($name:literal = $out:expr) => { - quick_xml::events::attributes::Attribute { - key: quick_xml::name::QName($name), - value: std::borrow::Cow::from(($out).to_string().into_bytes()), - } - }; -} - -macro_rules! gen_attrs { - ($($name:literal = $out:expr),+) => { - vec![ - $(gen_attr!($name = $out)),+ - ] - }; -} - pub mod blend; pub mod color_matrix; pub mod component_transfer; @@ -114,7 +97,7 @@ impl WriteElement for FePrimitive { FePrimitive::Offset(el) => el.attrs(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), - FePrimitive::Turbulence(_) => todo!(), + FePrimitive::Turbulence(el) => el.attrs(), } } @@ -135,7 +118,7 @@ impl WriteElement for FePrimitive { FePrimitive::Offset(el) => el.tag_name(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), - FePrimitive::Turbulence(_) => todo!(), + FePrimitive::Turbulence(el) => el.tag_name(), } } } diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs index d538006..2cc59e5 100644 --- a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -3,38 +3,43 @@ use super::WriteElement; /// [feTurbulence](https://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement) #[derive(Debug)] pub struct Turbulence { - base_frequency: (f32, f32), - num_octaves: u16, - seed: u32, - stitch_tiles: StitchTiles, + pub base_frequency: (f32, f32), + pub num_octaves: u16, + pub seed: u32, + pub stitch_tiles: StitchTiles, // attr name: type - noise_type: NoiseType, + pub noise_type: NoiseType, } impl WriteElement for Turbulence { #[allow(clippy::str_to_string, reason = "in macro invocation")] fn attrs(&self) -> Vec { - let mut r = gen_attrs!( - b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1) - ); + // let mut r = gen_attrs!( + // b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1) + // ); - if self.num_octaves != 1 { - r.push(gen_attr!(b"numOctaves" = self.num_octaves)); - } + // if self.num_octaves != 1 { + // r.push(gen_attr!(b"numOctaves" = self.num_octaves)); + // } - if self.seed != 0 { - r.push(gen_attr!(b"seed" = self.seed)); - } + // if self.seed != 0 { + // r.push(gen_attr!(b"seed" = self.seed)); + // } - if self.stitch_tiles != StitchTiles::NoStitch { - r.push(gen_attr!(b"stitchTiles" = "stitch")); - } + // if self.stitch_tiles != StitchTiles::NoStitch { + // r.push(gen_attr!(b"stitchTiles" = "stitch")); + // } - if self.noise_type != NoiseType::Turbulence { - r.push(gen_attr!(b"type" = "fractalNoise")); - } - - r + // if self.noise_type != NoiseType::Turbulence { + // r.push(gen_attr!(b"type" = "fractalNoise")); + // } + gen_attrs_with_conds![ + b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1), + self.num_octaves != 1 => b"numOctaves" = self.num_octaves, + self.seed != 0 => b"seed" = self.seed, + self.stitch_tiles != StitchTiles::NoStitch => b"stitchTiles" = "stitch", + self.noise_type != NoiseType::Turbulence => b"type" = "fractalNoise" + ] } fn tag_name(&self) -> &'static str { From c31a158d9b38fd7aafacb009485fc425efe5132d Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 20 Mar 2024 19:11:42 +0100 Subject: [PATCH 094/189] svg-filters: rework macro slightly --- crates/svg-filters/src/lib.rs | 16 ++++----- crates/svg-filters/src/main.rs | 19 +++++++--- crates/svg-filters/src/types/nodes.rs | 36 ++++--------------- .../src/types/nodes/primitives/blend.rs | 6 ++-- .../types/nodes/primitives/color_matrix.rs | 4 +-- .../src/types/nodes/primitives/composite.rs | 8 ++--- .../src/types/nodes/primitives/flood.rs | 7 ++-- .../types/nodes/primitives/gaussian_blur.rs | 2 +- .../src/types/nodes/primitives/morphology.rs | 9 ++--- .../src/types/nodes/primitives/offset.rs | 6 +--- .../src/types/nodes/primitives/turbulence.rs | 35 +++++------------- 11 files changed, 52 insertions(+), 96 deletions(-) diff --git a/crates/svg-filters/src/lib.rs b/crates/svg-filters/src/lib.rs index e1e0272..2afb148 100644 --- a/crates/svg-filters/src/lib.rs +++ b/crates/svg-filters/src/lib.rs @@ -12,23 +12,23 @@ pub mod util { } macro_rules! gen_attrs { - ($($name:literal = $out:expr),+) => { + ($($name:literal: $out:expr),+) => { vec![ $(gen_attr!($name = $out)),+ ] }; - } - - macro_rules! gen_attrs_with_conds { - ($($name:literal = $out:expr),+, $($cond:expr => $name_:literal = $out_:expr),+) => { - { - let mut r = gen_attrs![$($name = $out),+]; + ($($cond:expr => $name:literal: $out:expr),+) => { + { + let mut r = Vec::new(); $(if $cond { - r.push(gen_attr!($name_ = $out_)); + r.push(gen_attr!($name = $out)); })+ r } }; + ($other:ident; $($cond:expr => $name:literal: $out:expr),+) => { + $other.append(&mut gen_attrs![$($cond => $name: $out),+]); + }; } } diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index 1bf86c8..2fc8df3 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -5,7 +5,12 @@ use svg_filters::{ types::{ graph::edge::Edge, nodes::{ - primitives::{blend::BlendMode, color_matrix::ColorMatrixType}, + primitives::{ + blend::BlendMode, + color_matrix::ColorMatrixType, + turbulence::{NoiseType, StitchTiles, Turbulence}, + FePrimitive, + }, standard_input::StandardInput, }, }, @@ -15,11 +20,15 @@ use svg_filters::{ fn main() { let mut doc = SvgDocument::new(); - let blend = doc.create_filter("blend"); + let noise = doc.create_filter("noise"); - let offset0 = blend.offset(StandardInput::SourceGraphic, 100., 0.); - let offset1 = blend.offset(StandardInput::SourceGraphic, -100., 0.); - blend.blend(offset0, offset1, BlendMode::Multiply); + noise.add_node(Node::simple(FePrimitive::Turbulence(Turbulence { + base_frequency: (0.2, 0.2), + num_octaves: 1, + seed: 2, + stitch_tiles: StitchTiles::NoStitch, + noise_type: NoiseType::FractalNoise, + }))); eprintln!("{}", doc.generate_svg_pretty()); println!("{}", doc.generate_svg()); diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 656574d..2edc63b 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -45,36 +45,12 @@ pub struct CommonAttrs { impl From for Vec> { fn from(val: CommonAttrs) -> Self { - let mut r = Vec::new(); - if !val.x.is_zero() { - r.push(Attribute { - key: QName(b"x"), - value: Cow::from(val.x.to_string().into_bytes()), - }); - } - - if !val.y.is_zero() { - r.push(Attribute { - key: QName(b"y"), - value: Cow::from(val.y.to_string().into_bytes()), - }); - } - - if !val.width.is_zero() { - r.push(Attribute { - key: QName(b"width"), - value: Cow::from(val.width.to_string().into_bytes()), - }); - } - - if !val.height.is_zero() { - r.push(Attribute { - key: QName(b"height"), - value: Cow::from(val.height.to_string().into_bytes()), - }); - } - - r + gen_attrs![ + !val.x.is_zero() => b"x": val.x, + !val.y.is_zero() => b"y": val.y, + !val.width.is_zero() => b"width": val.width, + !val.height.is_zero() => b"height": val.height + ] } } diff --git a/crates/svg-filters/src/types/nodes/primitives/blend.rs b/crates/svg-filters/src/types/nodes/primitives/blend.rs index 1887042..3e28401 100644 --- a/crates/svg-filters/src/types/nodes/primitives/blend.rs +++ b/crates/svg-filters/src/types/nodes/primitives/blend.rs @@ -1,6 +1,4 @@ -use std::{borrow::Cow, fmt::Display}; - -use quick_xml::{events::attributes::Attribute, name::QName}; +use std::fmt::Display; use super::WriteElement; @@ -29,7 +27,7 @@ impl WriteElement for Blend { if let BlendMode::Normal = self.mode { Vec::new() } else { - gen_attrs![b"mode" = self.mode] + gen_attrs![b"mode": self.mode] } } diff --git a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs index 31e4130..3a31b7d 100644 --- a/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs +++ b/crates/svg-filters/src/types/nodes/primitives/color_matrix.rs @@ -16,7 +16,7 @@ impl WriteElement for ColorMatrix { fn attrs(&self) -> Vec { match &self.cm_type { ColorMatrixType::Matrix(v) => gen_attrs![ - b"values" = v + b"values": v .iter() .map(std::string::ToString::to_string) .reduce(|mut acc, e| { @@ -27,7 +27,7 @@ impl WriteElement for ColorMatrix { .expect("fixed length arr should always work") ], ColorMatrixType::Saturate(v) | ColorMatrixType::HueRotate(v) => { - gen_attrs![b"values" = v] + gen_attrs![b"values": v] } ColorMatrixType::LuminanceToAlpha => Vec::new(), } diff --git a/crates/svg-filters/src/types/nodes/primitives/composite.rs b/crates/svg-filters/src/types/nodes/primitives/composite.rs index b877fe8..45f639c 100644 --- a/crates/svg-filters/src/types/nodes/primitives/composite.rs +++ b/crates/svg-filters/src/types/nodes/primitives/composite.rs @@ -70,10 +70,10 @@ impl WriteElement for Composite { // }, // ]); r.append(&mut gen_attrs![ - b"k1" = k1, - b"k2" = k2, - b"k3" = k3, - b"k4" = k4 + b"k1": k1, + b"k2": k2, + b"k3": k3, + b"k4": k4 ]); } diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 3342ef7..4daa3c8 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -1,7 +1,4 @@ -use std::borrow::Cow; - use csscolorparser::Color; -use quick_xml::{events::attributes::Attribute, name::QName}; use super::WriteElement; @@ -15,8 +12,8 @@ pub struct Flood { impl WriteElement for Flood { fn attrs(&self) -> Vec { gen_attrs![ - b"flood-color" = self.flood_color.to_hex_string(), - b"flood-opacity" = self.flood_opacity + b"flood-color": self.flood_color.to_hex_string(), + b"flood-opacity": self.flood_opacity ] } diff --git a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs index e255df4..cd18f72 100644 --- a/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs +++ b/crates/svg-filters/src/types/nodes/primitives/gaussian_blur.rs @@ -26,7 +26,7 @@ impl GaussianBlur { impl WriteElement for GaussianBlur { fn attrs(&self) -> Vec { - gen_attrs![b"stdDeviation" = format!("{} {}", self.std_deviation.0, self.std_deviation.1)] + gen_attrs![b"stdDeviation": format!("{} {}", self.std_deviation.0, self.std_deviation.1)] } fn tag_name(&self) -> &'static str { diff --git a/crates/svg-filters/src/types/nodes/primitives/morphology.rs b/crates/svg-filters/src/types/nodes/primitives/morphology.rs index f9087d6..f6b7bbf 100644 --- a/crates/svg-filters/src/types/nodes/primitives/morphology.rs +++ b/crates/svg-filters/src/types/nodes/primitives/morphology.rs @@ -1,8 +1,5 @@ -use std::{borrow::Cow, fmt::Display}; - -use quick_xml::{events::attributes::Attribute, name::QName}; - use super::WriteElement; +use std::fmt::Display; /// [feMorphology](https://www.w3.org/TR/SVG11/filters.html#feMorphologyElement) #[derive(Debug)] @@ -14,8 +11,8 @@ pub struct Morphology { impl WriteElement for Morphology { fn attrs(&self) -> Vec { gen_attrs![ - b"operator" = self.operator, - b"radius" = format!("{} {}", self.radius.0, self.radius.1) + b"operator": self.operator, + b"radius": format!("{} {}", self.radius.0, self.radius.1) ] } diff --git a/crates/svg-filters/src/types/nodes/primitives/offset.rs b/crates/svg-filters/src/types/nodes/primitives/offset.rs index fa17dca..7ccf2fd 100644 --- a/crates/svg-filters/src/types/nodes/primitives/offset.rs +++ b/crates/svg-filters/src/types/nodes/primitives/offset.rs @@ -1,7 +1,3 @@ -use std::borrow::Cow; - -use quick_xml::{events::attributes::Attribute, name::QName}; - use super::WriteElement; /// [feOffset](https://www.w3.org/TR/SVG11/filters.html#feOffsetElement) @@ -19,7 +15,7 @@ impl Offset { impl WriteElement for Offset { fn attrs(&self) -> Vec { - gen_attrs![b"dx" = self.dx, b"dy" = self.dy] + gen_attrs![b"dx": self.dx, b"dy": self.dy] } fn tag_name(&self) -> &'static str { diff --git a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs index 2cc59e5..8fc4ae9 100644 --- a/crates/svg-filters/src/types/nodes/primitives/turbulence.rs +++ b/crates/svg-filters/src/types/nodes/primitives/turbulence.rs @@ -14,32 +14,15 @@ pub struct Turbulence { impl WriteElement for Turbulence { #[allow(clippy::str_to_string, reason = "in macro invocation")] fn attrs(&self) -> Vec { - // let mut r = gen_attrs!( - // b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1) - // ); - - // if self.num_octaves != 1 { - // r.push(gen_attr!(b"numOctaves" = self.num_octaves)); - // } - - // if self.seed != 0 { - // r.push(gen_attr!(b"seed" = self.seed)); - // } - - // if self.stitch_tiles != StitchTiles::NoStitch { - // r.push(gen_attr!(b"stitchTiles" = "stitch")); - // } - - // if self.noise_type != NoiseType::Turbulence { - // r.push(gen_attr!(b"type" = "fractalNoise")); - // } - gen_attrs_with_conds![ - b"baseFrequency" = format!("{} {}", self.base_frequency.0, self.base_frequency.1), - self.num_octaves != 1 => b"numOctaves" = self.num_octaves, - self.seed != 0 => b"seed" = self.seed, - self.stitch_tiles != StitchTiles::NoStitch => b"stitchTiles" = "stitch", - self.noise_type != NoiseType::Turbulence => b"type" = "fractalNoise" - ] + let mut r = gen_attrs![b"baseFrequency": format!("{} {}", self.base_frequency.0, self.base_frequency.1)]; + gen_attrs![ + r; + self.num_octaves != 1 => b"numOctaves": self.num_octaves, + self.seed != 0 => b"seed": self.seed, + self.stitch_tiles != StitchTiles::NoStitch => b"stitchTiles": "stitch", + self.noise_type != NoiseType::Turbulence => b"type": "fractalNoise" + ]; + r } fn tag_name(&self) -> &'static str { From 9727ef82cafe1f50280ee2d097df23dd974f2053 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 22 Mar 2024 16:05:36 +0100 Subject: [PATCH 095/189] svg-filters: implement feComponentTransfer rendering --- crates/svg-filters/src/tests.rs | 39 +++++++- .../svg-filters/src/types/nodes/primitives.rs | 31 ++++++- .../nodes/primitives/component_transfer.rs | 93 +++++++++++++++++++ 3 files changed, 160 insertions(+), 3 deletions(-) diff --git a/crates/svg-filters/src/tests.rs b/crates/svg-filters/src/tests.rs index 72b970f..771ab3a 100644 --- a/crates/svg-filters/src/tests.rs +++ b/crates/svg-filters/src/tests.rs @@ -5,7 +5,44 @@ mod complex; mod gaussian_blur; mod offset; -mod component_transfer {} +mod component_transfer { + use crate::{ + codegen::SvgDocument, + types::nodes::primitives::{ + component_transfer::{ComponentTransfer, TransferFn}, + FePrimitive, + }, + Node, + }; + + #[test] + fn test_comp_trans_simple() { + let mut doc = SvgDocument::new(); + + let comptrans = doc.create_filter("comp_trans"); + + comptrans.add_node(Node::simple(FePrimitive::ComponentTransfer( + ComponentTransfer { + func_r: TransferFn::Table { + table_values: vec![0., 0.1, 0.4, 0.9], + }, + func_g: TransferFn::Discrete { + table_values: vec![0.1, 0.3, 0.5, 0.7, 0.9], + }, + func_b: TransferFn::Linear { + slope: 1.0, + intercept: 0.75, + }, + func_a: TransferFn::Identity, + }, + ))); + + assert_eq!( + doc.generate_svg(), + r#""# + ); + } +} mod composite {} mod convolve_matrix {} mod diffuse_lighting {} diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index f3c101a..0b6e758 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -84,7 +84,7 @@ impl WriteElement for FePrimitive { match self { FePrimitive::Blend(el) => el.attrs(), FePrimitive::ColorMatrix(el) => el.attrs(), - FePrimitive::ComponentTransfer(_) => todo!(), + FePrimitive::ComponentTransfer(el) => el.attrs(), FePrimitive::Composite(el) => el.attrs(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), @@ -105,7 +105,7 @@ impl WriteElement for FePrimitive { match self { FePrimitive::Blend(el) => el.tag_name(), FePrimitive::ColorMatrix(el) => el.tag_name(), - FePrimitive::ComponentTransfer(_) => todo!(), + FePrimitive::ComponentTransfer(el) => el.tag_name(), FePrimitive::Composite(el) => el.tag_name(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), @@ -121,4 +121,31 @@ impl WriteElement for FePrimitive { FePrimitive::Turbulence(el) => el.tag_name(), } } + + fn element_writer<'writer, 'result>( + &self, + writer: &'writer mut Writer<&'result mut Vec>, + common: CommonAttrs, + inputs: Vec, + output: Option, + ) -> quick_xml::Result<&'writer mut quick_xml::Writer<&'result mut Vec>> { + match self { + FePrimitive::Blend(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::ColorMatrix(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::ComponentTransfer(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::Composite(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), + FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::Flood(_) => todo!(), + FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::Image(_) => todo!(), + FePrimitive::Merge(_) => todo!(), + FePrimitive::Morphology(_) => todo!(), + FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::SpecularLighting(_) => todo!(), + FePrimitive::Tile(_) => todo!(), + FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output), + } + } } diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs index d495ecc..1c37c50 100644 --- a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -1,3 +1,5 @@ +use quick_xml::{events::attributes::Attribute, Writer}; + use super::WriteElement; /// [feComponentTransfer](https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement) @@ -17,6 +19,44 @@ impl WriteElement for ComponentTransfer { fn tag_name(&self) -> &'static str { "feComponentTransfer" } + + fn element_writer<'writer, 'result>( + &self, + writer: &'writer mut quick_xml::Writer<&'result mut Vec>, + common: crate::types::nodes::CommonAttrs, + inputs: Vec, + output: Option, + ) -> quick_xml::Result<&'writer mut quick_xml::Writer<&'result mut Vec>> { + let inputs: Vec<_> = inputs + .into_iter() + .enumerate() + .map(|(i, edge)| { + ( + match i { + 0 => "in".to_owned(), + n => format!("in{}", n + 1), + } + .into_bytes(), + edge.into_bytes(), + ) + }) + .collect(); + let mut el_writer = writer + .create_element(self.tag_name()) + .with_attributes(inputs.iter().map(|(k, v)| (&k[..], &v[..]))) + .with_attributes(Into::>>::into(common)); + if let Some(output) = output { + el_writer = el_writer.with_attribute(("result", output.as_str())); + } + + el_writer.write_inner_content(|writer| { + self.func_r.write_self(writer, "feFuncR")?; + self.func_g.write_self(writer, "feFuncG")?; + self.func_b.write_self(writer, "feFuncB")?; + self.func_a.write_self(writer, "feFuncA")?; + Ok(()) + }) + } } /// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) @@ -39,3 +79,56 @@ pub enum TransferFn { offset: f32, }, } + +impl TransferFn { + #[allow(clippy::str_to_string, reason = "inside macro call")] + fn write_self<'writer, 'result>( + &self, + target: &'writer mut Writer<&'result mut Vec>, + name: &'static str, + ) -> quick_xml::Result<&'writer mut Writer<&'result mut Vec>> { + target + .create_element(name) + .with_attributes(match self { + TransferFn::Identity => gen_attrs![b"type": "identity"], + TransferFn::Table { table_values } => gen_attrs![ + b"type": "table", + b"tableValues": table_values + .iter() + .map(std::string::ToString::to_string) + .reduce(|mut acc, e| { + acc.push(' '); + acc.push_str(&e); + acc + }).expect("empty tables disallowed") + ], + TransferFn::Discrete { table_values } => gen_attrs![ + b"type": "discrete", + b"tableValues": table_values + .iter() + .map(std::string::ToString::to_string) + .reduce(|mut acc, e| { + acc.push(' '); + acc.push_str(&e); + acc + }).expect("empty tables disallowed") + ], + TransferFn::Linear { slope, intercept } => gen_attrs![ + b"type": "linear", + b"slope": slope, + b"intercept": intercept + ], + TransferFn::Gamma { + amplitude, + exponent, + offset, + } => gen_attrs![ + b"type": "gamma", + b"amplitude": amplitude, + b"exponent": exponent, + b"offset": offset + ], + }) + .write_empty() + } +} From 9ae8c2fbd3620f3b9d792aa859de535a24f583c6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 22 Mar 2024 16:24:04 +0100 Subject: [PATCH 096/189] svg-filters: add nice abstractions for component transfer --- crates/svg-filters/src/types/graph.rs | 82 ++++++++++++++++++- crates/svg-filters/src/types/nodes.rs | 44 ++++++++++ .../svg-filters/src/types/nodes/primitives.rs | 21 +++-- .../nodes/primitives/component_transfer.rs | 2 +- 4 files changed, 135 insertions(+), 14 deletions(-) diff --git a/crates/svg-filters/src/types/graph.rs b/crates/svg-filters/src/types/graph.rs index 05d63c3..524ba92 100644 --- a/crates/svg-filters/src/types/graph.rs +++ b/crates/svg-filters/src/types/graph.rs @@ -139,10 +139,12 @@ impl FilterGraph { } pub mod abstracted_inputs { - use petgraph::prelude::NodeIndex; + use petgraph::{data::Build, prelude::NodeIndex}; use crate::{ - types::nodes::primitives::{blend::BlendMode, color_matrix::ColorMatrixType}, + types::nodes::primitives::{ + blend::BlendMode, color_matrix::ColorMatrixType, component_transfer::TransferFn, + }, Node, }; @@ -211,6 +213,82 @@ pub mod abstracted_inputs { .add_edge(self.resolve_input(in2.into()), node_idx, ()); node_idx } + + pub fn component_transfer_rgba( + &mut self, + r#in: impl Into, + r: TransferFn, + g: TransferFn, + b: TransferFn, + a: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_rgba(r, g, b, a)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_rgb( + &mut self, + r#in: impl Into, + r: TransferFn, + g: TransferFn, + b: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_rgb(r, g, b)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_r( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_r(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_g( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_g(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_b( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_b(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_a( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_a(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_single( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_single(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } } } diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index 2edc63b..c9f9334 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -150,4 +150,48 @@ impl Node { func_a: a, })) } + + pub fn component_transfer_rgb(r: TransferFn, g: TransferFn, b: TransferFn) -> Self { + Self::component_transfer_rgba(r, g, b, TransferFn::Identity) + } + + pub fn component_transfer_r(func: TransferFn) -> Self { + Self::component_transfer_rgba( + func, + TransferFn::Identity, + TransferFn::Identity, + TransferFn::Identity, + ) + } + + pub fn component_transfer_g(func: TransferFn) -> Self { + Self::component_transfer_rgba( + TransferFn::Identity, + func, + TransferFn::Identity, + TransferFn::Identity, + ) + } + + pub fn component_transfer_b(func: TransferFn) -> Self { + Self::component_transfer_rgba( + TransferFn::Identity, + TransferFn::Identity, + func, + TransferFn::Identity, + ) + } + + pub fn component_transfer_a(func: TransferFn) -> Self { + Self::component_transfer_rgba( + TransferFn::Identity, + TransferFn::Identity, + TransferFn::Identity, + func, + ) + } + + pub fn component_transfer_single(func: TransferFn) -> Self { + Self::component_transfer_rgb(func.clone(), func.clone(), func) + } } diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 0b6e758..5cdd232 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -1,6 +1,5 @@ -use std::convert::Into; - use quick_xml::{events::attributes::Attribute, ElementWriter, Writer}; +use std::convert::Into; use super::CommonAttrs; @@ -86,18 +85,18 @@ impl WriteElement for FePrimitive { FePrimitive::ColorMatrix(el) => el.attrs(), FePrimitive::ComponentTransfer(el) => el.attrs(), FePrimitive::Composite(el) => el.attrs(), + FePrimitive::GaussianBlur(el) => el.attrs(), + FePrimitive::Offset(el) => el.attrs(), + FePrimitive::Turbulence(el) => el.attrs(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), FePrimitive::Flood(_) => todo!(), - FePrimitive::GaussianBlur(el) => el.attrs(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), - FePrimitive::Offset(el) => el.attrs(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), - FePrimitive::Turbulence(el) => el.attrs(), } } @@ -107,18 +106,18 @@ impl WriteElement for FePrimitive { FePrimitive::ColorMatrix(el) => el.tag_name(), FePrimitive::ComponentTransfer(el) => el.tag_name(), FePrimitive::Composite(el) => el.tag_name(), + FePrimitive::GaussianBlur(el) => el.tag_name(), + FePrimitive::Offset(el) => el.tag_name(), + FePrimitive::Turbulence(el) => el.tag_name(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), FePrimitive::Flood(_) => todo!(), - FePrimitive::GaussianBlur(el) => el.tag_name(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), - FePrimitive::Offset(el) => el.tag_name(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), - FePrimitive::Turbulence(el) => el.tag_name(), } } @@ -134,18 +133,18 @@ impl WriteElement for FePrimitive { FePrimitive::ColorMatrix(el) => el.element_writer(writer, common, inputs, output), FePrimitive::ComponentTransfer(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Composite(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), FePrimitive::Flood(_) => todo!(), - FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), - FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), - FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output), } } } diff --git a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs index 1c37c50..3f8a3a3 100644 --- a/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs +++ b/crates/svg-filters/src/types/nodes/primitives/component_transfer.rs @@ -60,7 +60,7 @@ impl WriteElement for ComponentTransfer { } /// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements) -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum TransferFn { Identity, Table { From 919a3bb377ba4654153861b8bbc6b90065f14442 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 22 Mar 2024 16:47:21 +0100 Subject: [PATCH 097/189] svg-filters: seperate out abstractions and add flood abstraction --- crates/svg-filters/src/types/graph.rs | 154 +---------------- .../src/types/graph/abstracted_inputs.rs | 155 ++++++++++++++++++ crates/svg-filters/src/types/nodes.rs | 13 ++ .../svg-filters/src/types/nodes/primitives.rs | 6 +- .../src/types/nodes/primitives/flood.rs | 4 +- 5 files changed, 174 insertions(+), 158 deletions(-) create mode 100644 crates/svg-filters/src/types/graph/abstracted_inputs.rs diff --git a/crates/svg-filters/src/types/graph.rs b/crates/svg-filters/src/types/graph.rs index 524ba92..4b63a87 100644 --- a/crates/svg-filters/src/types/graph.rs +++ b/crates/svg-filters/src/types/graph.rs @@ -138,158 +138,6 @@ impl FilterGraph { } } -pub mod abstracted_inputs { - use petgraph::{data::Build, prelude::NodeIndex}; - - use crate::{ - types::nodes::primitives::{ - blend::BlendMode, color_matrix::ColorMatrixType, component_transfer::TransferFn, - }, - Node, - }; - - use super::{FilterGraph, NodeInput}; - - impl FilterGraph { - pub fn color_matrix( - &mut self, - r#in: impl Into, - cm_type: ColorMatrixType, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::color_matrix(cm_type)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - - pub fn offset(&mut self, r#in: impl Into, dx: f32, dy: f32) -> NodeIndex { - let node_idx = self.dag.add_node(Node::offset(dx, dy)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - - pub fn gaussian_blur_xy( - &mut self, - r#in: impl Into, - x: u16, - y: u16, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::gaussian_blur_xy(x, y)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - - pub fn blend( - &mut self, - r#in: impl Into, - in2: impl Into, - mode: BlendMode, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::blend(mode)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - self.dag - .add_edge(self.resolve_input(in2.into()), node_idx, ()); - node_idx - } - - pub fn composite_arithmetic( - &mut self, - r#in: impl Into, - in2: impl Into, - k1: f32, - k2: f32, - k3: f32, - k4: f32, - ) -> NodeIndex { - let node_idx = self - .dag - .add_node(Node::composite_arithmetic(k1, k2, k3, k4)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - self.dag - .add_edge(self.resolve_input(in2.into()), node_idx, ()); - node_idx - } - - pub fn component_transfer_rgba( - &mut self, - r#in: impl Into, - r: TransferFn, - g: TransferFn, - b: TransferFn, - a: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_rgba(r, g, b, a)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_rgb( - &mut self, - r#in: impl Into, - r: TransferFn, - g: TransferFn, - b: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_rgb(r, g, b)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_r( - &mut self, - r#in: impl Into, - func: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_r(func)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_g( - &mut self, - r#in: impl Into, - func: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_g(func)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_b( - &mut self, - r#in: impl Into, - func: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_b(func)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_a( - &mut self, - r#in: impl Into, - func: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_a(func)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - pub fn component_transfer_single( - &mut self, - r#in: impl Into, - func: TransferFn, - ) -> NodeIndex { - let node_idx = self.dag.add_node(Node::component_transfer_single(func)); - self.dag - .add_edge(self.resolve_input(r#in.into()), node_idx, ()); - node_idx - } - } -} +pub mod abstracted_inputs; pub mod edge; diff --git a/crates/svg-filters/src/types/graph/abstracted_inputs.rs b/crates/svg-filters/src/types/graph/abstracted_inputs.rs new file mode 100644 index 0000000..ca576c5 --- /dev/null +++ b/crates/svg-filters/src/types/graph/abstracted_inputs.rs @@ -0,0 +1,155 @@ +use csscolorparser::Color; +use petgraph::{data::Build, prelude::NodeIndex}; + +use crate::{ + types::nodes::primitives::{ + blend::BlendMode, color_matrix::ColorMatrixType, component_transfer::TransferFn, + }, + Node, +}; + +use super::{FilterGraph, NodeInput}; + +impl FilterGraph { + pub fn color_matrix( + &mut self, + r#in: impl Into, + cm_type: ColorMatrixType, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::color_matrix(cm_type)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn offset(&mut self, r#in: impl Into, dx: f32, dy: f32) -> NodeIndex { + let node_idx = self.dag.add_node(Node::offset(dx, dy)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn gaussian_blur_xy(&mut self, r#in: impl Into, x: u16, y: u16) -> NodeIndex { + let node_idx = self.dag.add_node(Node::gaussian_blur_xy(x, y)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn blend( + &mut self, + r#in: impl Into, + in2: impl Into, + mode: BlendMode, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::blend(mode)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(in2.into()), node_idx, ()); + node_idx + } + + pub fn composite_arithmetic( + &mut self, + r#in: impl Into, + in2: impl Into, + k1: f32, + k2: f32, + k3: f32, + k4: f32, + ) -> NodeIndex { + let node_idx = self + .dag + .add_node(Node::composite_arithmetic(k1, k2, k3, k4)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(in2.into()), node_idx, ()); + node_idx + } + + pub fn component_transfer_rgba( + &mut self, + r#in: impl Into, + r: TransferFn, + g: TransferFn, + b: TransferFn, + a: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_rgba(r, g, b, a)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_rgb( + &mut self, + r#in: impl Into, + r: TransferFn, + g: TransferFn, + b: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_rgb(r, g, b)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_r( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_r(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_g( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_g(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_b( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_b(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_a( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_a(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + pub fn component_transfer_single( + &mut self, + r#in: impl Into, + func: TransferFn, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::component_transfer_single(func)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + node_idx + } + + pub fn flood(&mut self, flood_color: Color, flood_opacity: f32) -> NodeIndex { + self.dag.add_node(Node::flood(flood_color, flood_opacity)) + } + + pub fn flood_opaque(&mut self, flood_color: Color) -> NodeIndex { + self.dag.add_node(Node::flood_opaque(flood_color)) + } +} diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index c9f9334..ba0340b 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -1,5 +1,6 @@ use std::borrow::Cow; +use csscolorparser::Color; use quick_xml::{events::attributes::Attribute, name::QName}; use self::{ @@ -8,6 +9,7 @@ use self::{ color_matrix::{ColorMatrix, ColorMatrixType}, component_transfer::{ComponentTransfer, TransferFn}, composite::{Composite, CompositeOperator}, + flood::Flood, gaussian_blur::GaussianBlur, offset::Offset, FePrimitive, @@ -194,4 +196,15 @@ impl Node { pub fn component_transfer_single(func: TransferFn) -> Self { Self::component_transfer_rgb(func.clone(), func.clone(), func) } + + pub fn flood(flood_color: Color, flood_opacity: f32) -> Self { + Self::simple(FePrimitive::Flood(Flood { + flood_color, + flood_opacity, + })) + } + + pub fn flood_opaque(flood_color: Color) -> Self { + Self::flood(flood_color, 1.) + } } diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 5cdd232..a46ee9b 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -91,7 +91,7 @@ impl WriteElement for FePrimitive { FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), - FePrimitive::Flood(_) => todo!(), + FePrimitive::Flood(el) => el.attrs(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), @@ -112,7 +112,7 @@ impl WriteElement for FePrimitive { FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), - FePrimitive::Flood(_) => todo!(), + FePrimitive::Flood(el) => el.tag_name(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), @@ -139,7 +139,7 @@ impl WriteElement for FePrimitive { FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(_) => todo!(), - FePrimitive::Flood(_) => todo!(), + FePrimitive::Flood(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), FePrimitive::Morphology(_) => todo!(), diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 4daa3c8..df912ef 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -5,8 +5,8 @@ use super::WriteElement; /// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) #[derive(Debug)] pub struct Flood { - flood_color: Color, - flood_opacity: f32, + pub flood_color: Color, + pub flood_opacity: f32, } impl WriteElement for Flood { From 0197df5ee29e7dcd633b11ac899ac48575a53db8 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 24 Mar 2024 15:49:41 +0100 Subject: [PATCH 098/189] svg-filters: add turbulence and displacement map --- .../src/types/graph/abstracted_inputs.rs | 43 ++++++++++++++++++- crates/svg-filters/src/types/nodes.rs | 27 ++++++++++++ .../svg-filters/src/types/nodes/primitives.rs | 6 +-- .../nodes/primitives/displacement_map.rs | 29 ++++++++++--- .../src/types/nodes/primitives/flood.rs | 2 + 5 files changed, 98 insertions(+), 9 deletions(-) diff --git a/crates/svg-filters/src/types/graph/abstracted_inputs.rs b/crates/svg-filters/src/types/graph/abstracted_inputs.rs index ca576c5..8d84707 100644 --- a/crates/svg-filters/src/types/graph/abstracted_inputs.rs +++ b/crates/svg-filters/src/types/graph/abstracted_inputs.rs @@ -3,7 +3,11 @@ use petgraph::{data::Build, prelude::NodeIndex}; use crate::{ types::nodes::primitives::{ - blend::BlendMode, color_matrix::ColorMatrixType, component_transfer::TransferFn, + blend::BlendMode, + color_matrix::ColorMatrixType, + component_transfer::TransferFn, + displacement_map::Channel, + turbulence::{NoiseType, StitchTiles}, }, Node, }; @@ -152,4 +156,41 @@ impl FilterGraph { pub fn flood_opaque(&mut self, flood_color: Color) -> NodeIndex { self.dag.add_node(Node::flood_opaque(flood_color)) } + + pub fn turbulence( + &mut self, + base_freq_x: f32, + base_freq_y: f32, + num_octaves: u16, + seed: u32, + stitch_tiles: StitchTiles, + noise_type: NoiseType, + ) -> NodeIndex { + self.dag.add_node(Node::turbulence( + base_freq_x, + base_freq_y, + num_octaves, + seed, + stitch_tiles, + noise_type, + )) + } + + pub fn displacement_map( + &mut self, + source_image: impl Into, + displacement_map: impl Into, + scale: f32, + x_channel: Channel, + y_channel: Channel, + ) -> NodeIndex { + let node_idx = self + .dag + .add_node(Node::displacement_map(scale, x_channel, y_channel)); + self.dag + .add_edge(self.resolve_input(source_image.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(displacement_map.into()), node_idx, ()); + node_idx + } } diff --git a/crates/svg-filters/src/types/nodes.rs b/crates/svg-filters/src/types/nodes.rs index ba0340b..797e7e4 100644 --- a/crates/svg-filters/src/types/nodes.rs +++ b/crates/svg-filters/src/types/nodes.rs @@ -9,9 +9,11 @@ use self::{ color_matrix::{ColorMatrix, ColorMatrixType}, component_transfer::{ComponentTransfer, TransferFn}, composite::{Composite, CompositeOperator}, + displacement_map::{Channel, DisplacementMap}, flood::Flood, gaussian_blur::GaussianBlur, offset::Offset, + turbulence::{NoiseType, StitchTiles, Turbulence}, FePrimitive, }, standard_input::StandardInput, @@ -207,4 +209,29 @@ impl Node { pub fn flood_opaque(flood_color: Color) -> Self { Self::flood(flood_color, 1.) } + + pub fn turbulence( + base_freq_x: f32, + base_freq_y: f32, + num_octaves: u16, + seed: u32, + stitch_tiles: StitchTiles, + noise_type: NoiseType, + ) -> Self { + Self::simple(FePrimitive::Turbulence(Turbulence { + base_frequency: (base_freq_x, base_freq_y), + num_octaves, + seed, + stitch_tiles, + noise_type, + })) + } + + pub fn displacement_map(scale: f32, x_channel: Channel, y_channel: Channel) -> Self { + Self::simple(FePrimitive::DisplacementMap(DisplacementMap { + scale, + x_channel_selector: x_channel, + y_channel_selector: y_channel, + })) + } } diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index a46ee9b..171314f 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -90,7 +90,7 @@ impl WriteElement for FePrimitive { FePrimitive::Turbulence(el) => el.attrs(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), - FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::DisplacementMap(el) => el.attrs(), FePrimitive::Flood(el) => el.attrs(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), @@ -111,7 +111,7 @@ impl WriteElement for FePrimitive { FePrimitive::Turbulence(el) => el.tag_name(), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), - FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::DisplacementMap(el) => el.tag_name(), FePrimitive::Flood(el) => el.tag_name(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), @@ -138,7 +138,7 @@ impl WriteElement for FePrimitive { FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output), FePrimitive::ConvolveMatrix(_) => todo!(), FePrimitive::DiffuseLighting(_) => todo!(), - FePrimitive::DisplacementMap(_) => todo!(), + FePrimitive::DisplacementMap(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Flood(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), diff --git a/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs index b6485ac..189291e 100644 --- a/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs +++ b/crates/svg-filters/src/types/nodes/primitives/displacement_map.rs @@ -1,13 +1,32 @@ +use super::WriteElement; + /// [feDisplacementMap](https://www.w3.org/TR/SVG11/filters.html#feDisplacementMapElement) #[derive(Debug)] pub struct DisplacementMap { - scale: f32, - x_channel_selector: Channel, - y_channel_selector: Channel, + pub scale: f32, + pub x_channel_selector: Channel, + pub y_channel_selector: Channel, } -#[derive(Debug)] -enum Channel { +impl WriteElement for DisplacementMap { + fn attrs(&self) -> Vec { + let mut r = Vec::new(); + gen_attrs![ + r; + self.scale != 0. => b"scale": self.scale, + self.x_channel_selector != Channel::A => b"xChannelSelector": format!("{:?}", self.x_channel_selector), + self.y_channel_selector != Channel::A => b"yChannelSelector": format!("{:?}", self.y_channel_selector) + ]; + r + } + + fn tag_name(&self) -> &'static str { + "feDisplacementMap" + } +} + +#[derive(Debug, PartialEq, Eq)] +pub enum Channel { A, R, G, diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index df912ef..3f10658 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -3,6 +3,8 @@ use csscolorparser::Color; use super::WriteElement; /// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) +// NOTE: this doesn't work for some reason, but the examples from mdn don't either. +// might be a browser bug, def worth investigating #[derive(Debug)] pub struct Flood { pub flood_color: Color, From 02c5e9e159f01bbc595638846e5db60707a6e6ae Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 24 Mar 2024 16:11:07 +0100 Subject: [PATCH 099/189] svg-filters: figured out flood not working in local test env --- crates/svg-filters/src/types/nodes/primitives/flood.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/svg-filters/src/types/nodes/primitives/flood.rs b/crates/svg-filters/src/types/nodes/primitives/flood.rs index 3f10658..df912ef 100644 --- a/crates/svg-filters/src/types/nodes/primitives/flood.rs +++ b/crates/svg-filters/src/types/nodes/primitives/flood.rs @@ -3,8 +3,6 @@ use csscolorparser::Color; use super::WriteElement; /// [feFlood](https://www.w3.org/TR/SVG11/filters.html#feFloodElement) -// NOTE: this doesn't work for some reason, but the examples from mdn don't either. -// might be a browser bug, def worth investigating #[derive(Debug)] pub struct Flood { pub flood_color: Color, From ae86ae29ab663f365a290034c685e221528c28f9 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 24 Mar 2024 17:07:35 +0100 Subject: [PATCH 100/189] svg-filters: more testssss --- crates/svg-filters/src/tests.rs | 49 ++----------------- .../src/tests/component_transfer.rs | 36 ++++++++++++++ .../svg-filters/src/tests/displacement_map.rs | 32 ++++++++++++ crates/svg-filters/src/tests/flood.rs | 17 +++++++ crates/svg-filters/src/tests/turbulence.rs | 25 ++++++++++ .../svg-filters/src/types/nodes/primitives.rs | 18 +++---- 6 files changed, 124 insertions(+), 53 deletions(-) create mode 100644 crates/svg-filters/src/tests/component_transfer.rs create mode 100644 crates/svg-filters/src/tests/displacement_map.rs create mode 100644 crates/svg-filters/src/tests/flood.rs create mode 100644 crates/svg-filters/src/tests/turbulence.rs diff --git a/crates/svg-filters/src/tests.rs b/crates/svg-filters/src/tests.rs index 771ab3a..742c457 100644 --- a/crates/svg-filters/src/tests.rs +++ b/crates/svg-filters/src/tests.rs @@ -1,56 +1,17 @@ -mod color_matrix; - mod blend; +mod color_matrix; mod complex; +mod component_transfer; +mod displacement_map; +mod flood; mod gaussian_blur; mod offset; - -mod component_transfer { - use crate::{ - codegen::SvgDocument, - types::nodes::primitives::{ - component_transfer::{ComponentTransfer, TransferFn}, - FePrimitive, - }, - Node, - }; - - #[test] - fn test_comp_trans_simple() { - let mut doc = SvgDocument::new(); - - let comptrans = doc.create_filter("comp_trans"); - - comptrans.add_node(Node::simple(FePrimitive::ComponentTransfer( - ComponentTransfer { - func_r: TransferFn::Table { - table_values: vec![0., 0.1, 0.4, 0.9], - }, - func_g: TransferFn::Discrete { - table_values: vec![0.1, 0.3, 0.5, 0.7, 0.9], - }, - func_b: TransferFn::Linear { - slope: 1.0, - intercept: 0.75, - }, - func_a: TransferFn::Identity, - }, - ))); - - assert_eq!( - doc.generate_svg(), - r#""# - ); - } -} +mod turbulence; mod composite {} mod convolve_matrix {} mod diffuse_lighting {} -mod displacement_map {} -mod flood {} mod image {} mod merge {} mod morphology {} mod specular_lighting {} mod tile {} -mod turbulence {} diff --git a/crates/svg-filters/src/tests/component_transfer.rs b/crates/svg-filters/src/tests/component_transfer.rs new file mode 100644 index 0000000..8f24c6f --- /dev/null +++ b/crates/svg-filters/src/tests/component_transfer.rs @@ -0,0 +1,36 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::primitives::{ + component_transfer::{ComponentTransfer, TransferFn}, + FePrimitive, + }, + Node, +}; + +#[test] +fn test_comp_trans_simple() { + let mut doc = SvgDocument::new(); + + let comptrans = doc.create_filter("comp_trans"); + + comptrans.add_node(Node::simple(FePrimitive::ComponentTransfer( + ComponentTransfer { + func_r: TransferFn::Table { + table_values: vec![0., 0.1, 0.4, 0.9], + }, + func_g: TransferFn::Discrete { + table_values: vec![0.1, 0.3, 0.5, 0.7, 0.9], + }, + func_b: TransferFn::Linear { + slope: 1.0, + intercept: 0.75, + }, + func_a: TransferFn::Identity, + }, + ))); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/displacement_map.rs b/crates/svg-filters/src/tests/displacement_map.rs new file mode 100644 index 0000000..3b41ff1 --- /dev/null +++ b/crates/svg-filters/src/tests/displacement_map.rs @@ -0,0 +1,32 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::{ + primitives::{ + displacement_map::Channel, + turbulence::{NoiseType, StitchTiles}, + }, + standard_input::StandardInput, + }, +}; + +#[test] +fn test_displacement_map_simple() { + let mut doc = SvgDocument::new(); + + let displace = doc.create_filter("displace"); + + let simple_noise = + displace.turbulence(0.01, 0.01, 1, 0, StitchTiles::Stitch, NoiseType::Turbulence); + displace.displacement_map( + StandardInput::SourceGraphic, + simple_noise, + 128., + Channel::R, + Channel::R, + ); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/flood.rs b/crates/svg-filters/src/tests/flood.rs new file mode 100644 index 0000000..27ed8bc --- /dev/null +++ b/crates/svg-filters/src/tests/flood.rs @@ -0,0 +1,17 @@ +use csscolorparser::Color; + +use crate::codegen::SvgDocument; + +#[test] +fn test_flood_simple() { + let mut doc = SvgDocument::new(); + + let turbdispl = doc.create_filter("noiseDisplace"); + + turbdispl.flood(Color::new(0.9, 0.7, 0.85, 1.), 1.); + + assert_eq!( + doc.generate_svg(), + r##""## + ); +} diff --git a/crates/svg-filters/src/tests/turbulence.rs b/crates/svg-filters/src/tests/turbulence.rs new file mode 100644 index 0000000..dd53e7d --- /dev/null +++ b/crates/svg-filters/src/tests/turbulence.rs @@ -0,0 +1,25 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::primitives::turbulence::{NoiseType, StitchTiles}, +}; + +#[test] +fn test_simple_turbulence() { + let mut doc = SvgDocument::new(); + + let noise = doc.create_filter("noise"); + + noise.turbulence( + 0.01, + 0.01, + 1, + 0, + StitchTiles::Stitch, + NoiseType::FractalNoise, + ); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index 171314f..4675b8e 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -88,13 +88,13 @@ impl WriteElement for FePrimitive { FePrimitive::GaussianBlur(el) => el.attrs(), FePrimitive::Offset(el) => el.attrs(), FePrimitive::Turbulence(el) => el.attrs(), - FePrimitive::ConvolveMatrix(_) => todo!(), - FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(el) => el.attrs(), FePrimitive::Flood(el) => el.attrs(), + FePrimitive::Morphology(el) => el.attrs(), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), - FePrimitive::Morphology(_) => todo!(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), } @@ -109,13 +109,13 @@ impl WriteElement for FePrimitive { FePrimitive::GaussianBlur(el) => el.tag_name(), FePrimitive::Offset(el) => el.tag_name(), FePrimitive::Turbulence(el) => el.tag_name(), - FePrimitive::ConvolveMatrix(_) => todo!(), - FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(el) => el.tag_name(), FePrimitive::Flood(el) => el.tag_name(), + FePrimitive::Morphology(el) => el.tag_name(), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), - FePrimitive::Morphology(_) => todo!(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), } @@ -136,13 +136,13 @@ impl WriteElement for FePrimitive { FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output), FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output), - FePrimitive::ConvolveMatrix(_) => todo!(), - FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::DisplacementMap(el) => el.element_writer(writer, common, inputs, output), FePrimitive::Flood(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::Morphology(el) => el.element_writer(writer, common, inputs, output), + FePrimitive::ConvolveMatrix(_) => todo!(), + FePrimitive::DiffuseLighting(_) => todo!(), FePrimitive::Image(_) => todo!(), FePrimitive::Merge(_) => todo!(), - FePrimitive::Morphology(_) => todo!(), FePrimitive::SpecularLighting(_) => todo!(), FePrimitive::Tile(_) => todo!(), } From ca84af4e1bd6b22e7e32c3f3864c4f2618c94a15 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 3 Apr 2024 00:08:00 +0200 Subject: [PATCH 101/189] lang: basic parser --- Cargo.lock | 153 ++++++++++++++++++++++++++++++++- Cargo.toml | 1 + crates/lang/Cargo.toml | 4 + crates/lang/src/lib.rs | 4 + crates/lang/src/main.rs | 17 ++++ crates/lang/src/parser.rs | 134 +++++++++++++++++++++++++++++ crates/lang/src/parser/ast.rs | 36 ++++++++ crates/lang/src/tokens.rs | 11 ++- crates/svg-filters/Cargo.toml | 2 +- crates/svg-filters/src/main.rs | 29 +------ testfiles/test.owo | 4 + 11 files changed, 362 insertions(+), 33 deletions(-) create mode 100644 crates/lang/src/main.rs create mode 100644 crates/lang/src/parser.rs create mode 100644 crates/lang/src/parser/ast.rs create mode 100644 testfiles/test.owo diff --git a/Cargo.lock b/Cargo.lock index a8b1f50..bc8692d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,33 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "anstream" version = "0.6.5" @@ -133,12 +160,31 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chumsky" +version = "1.0.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c28d4e5dd9a9262a38b231153591da6ce1471b818233f4727985d3dd0ed93c" +dependencies = [ + "hashbrown", + "regex-automata", + "serde", + "stacker", + "unicode-ident", +] + [[package]] name = "clap" version = "4.4.12" @@ -389,6 +435,10 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "heck" @@ -417,9 +467,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -453,7 +503,11 @@ dependencies = [ name = "lang" version = "0.1.0" dependencies = [ + "chumsky", + "clap", + "indexmap", "logos", + "petgraph", ] [[package]] @@ -515,7 +569,7 @@ dependencies = [ "lazy_static", "proc-macro2", "quote", - "regex-syntax", + "regex-syntax 0.8.2", "syn", ] @@ -583,6 +637,12 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "option-ext" version = "0.2.0" @@ -675,6 +735,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "qoi" version = "0.4.1" @@ -758,6 +827,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "regex-automata" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -846,6 +932,19 @@ dependencies = [ "lock_api", ] +[[package]] +name = "stacker" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "winapi", +] + [[package]] name = "strsim" version = "0.10.0" @@ -942,6 +1041,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -954,6 +1059,28 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.48.0" @@ -1092,6 +1219,26 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/Cargo.toml b/Cargo.toml index cbd514c..2d4a618 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ resolver = "2" [workspace.dependencies] clap = { version = "4", features = ["derive"] } serde = { version = "1.0", features = ["derive"] } +petgraph = "0.6.4" # to enable all the lints below, this must be present in a workspace member's Cargo.toml: # [lints] diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 1182341..8126ffa 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -7,6 +7,10 @@ edition = "2021" [dependencies] logos = "0.14" +chumsky = "1.0.0-alpha.6" +petgraph = { workspace = true} +indexmap = "2.2.6" +clap = { version = "4", features = ["derive"] } [lints] workspace = true diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index 5c76635..6878991 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1 +1,5 @@ +pub mod parser; pub mod tokens; +pub mod err_reporting { + pub struct GlobalReporter {} +} diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs new file mode 100644 index 0000000..3fef5ac --- /dev/null +++ b/crates/lang/src/main.rs @@ -0,0 +1,17 @@ +use std::{fs, path::PathBuf}; + +use clap::Parser; +use lang::parser::parse; + +#[derive(Parser)] +struct Args { + file: PathBuf, +} + +fn main() { + let args = Args::parse(); + let f = fs::read_to_string(args.file).expect("failed to read file"); + + println!("file: {f}\n"); + println!("parsed: {:?}", parse(&f)) +} diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs new file mode 100644 index 0000000..b1034fa --- /dev/null +++ b/crates/lang/src/parser.rs @@ -0,0 +1,134 @@ +use std::ops::Range; + +use chumsky::{ + error::Rich, + extra, + input::{Stream, ValueInput}, + prelude::*, + primitive::just, + recursive::recursive, + select, + span::SimpleSpan, + IterParser, Parser, +}; +use indexmap::IndexMap; +use logos::{Logos, Source}; + +use crate::tokens::Token; + +pub mod ast; +use self::ast::{Expr, File}; + +type Span = SimpleSpan; +type Spanned = (T, Span); + +pub fn parse<'src>(src: &'src str) -> ParseResult, Rich<'_, Token<'_>>> { + let toks: Vec<_> = Token::lexer(src) + .spanned() + .into_iter() + .map(|(t, s)| (t.expect("TODO: add lexer error(s)"), Span::from(s))) + .collect(); + let tok_stream = Stream::from_iter(toks).spanned((src.len()..src.len()).into()); + expr_parser().parse(tok_stream) +} + +fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src>, Span = Span>>( +) -> impl Parser<'tokens, I, File<'src>, extra::Err, Span>>> { + let word = select! { Token::Word(word) => word }; + + let expr = recursive(|expr| { + let var = select! { + Token::VarIdent(name) => (Expr::Var as fn(_) -> _, name), + Token::InputIdent(name) => (Expr::InputVar as fn(_) -> _, name) + } + .map_with(|(item_type, name), extra| item_type((name, extra.span()))); + + let attrset = word + .map_with(|n, e| (n, e.span())) + .then_ignore(just(Token::Colon)) + .then(expr) + .separated_by(just(Token::Comma)) + .collect::>() + .map(IndexMap::from_iter) + .delimited_by(just(Token::BracketOpen), just(Token::BracketClose)) + .map_with(|v, e| (v, e.span())); + + let node = word + .map_with(|v, e| (v, e.span())) + .then(attrset.clone().or_not()) + .map(|(name, params)| Expr::Node(name, params)) + .or(var) + .or(attrset.map(Expr::AttrSet)); + + let pipeline = node + .clone() + .then(choice(( + just(Token::Pipe).to(Expr::SimplePipe as fn(_, _) -> _), + just(Token::MappingPipe).to(Expr::MappingPipe as fn(_, _) -> _), + just(Token::NullPipe).to(Expr::NullPipe as fn(_, _) -> _), + ))) + .repeated() + .foldr(node, |(curr, pipe), next| { + pipe(Box::new(curr), Box::new(next)) + }); + + pipeline + }); + + let decl = just(Token::Def).ignore_then( + word.map_with(|n, e| (n, e.span())) + .then_ignore(just(Token::Equals)) + .then(expr.clone().map_with(|expr, extra| (expr, extra.span()))) + .then_ignore(just(Token::SemiColon)), + ); + + expr.map_with(|expr, extra| File { + decls: IndexMap::from_iter([(("main", (0..0).into()), (expr, extra.span()))]), + }) + .or(decl.repeated().collect::>().map(|decls| File { + decls: IndexMap::from_iter(decls), + })) +} + +#[cfg(test)] +mod tests { + use crate::parser::ast::{Expr, File}; + use crate::parser::parse; + use crate::tokens::Token; + use chumsky::input::Stream; + use chumsky::prelude::*; + use indexmap::IndexMap; + use logos::Logos; + + #[test] + fn test_parse_node_with_params() { + const INPUT: &str = "meow [ hello: $foo, world: @bar]"; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([( + ("main", (0..0).into()), + ( + Expr::Node( + ("meow", (0..4).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (7..12).into()), + Expr::Var(("foo", (14..18).into())) + ), + ( + ("world", (20..25).into()), + Expr::InputVar(("bar", (27..31).into())) + ) + ]), + (5..32).into() + )) + ), + (0..0).into() + ) + )]) + } + ); + } +} diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs new file mode 100644 index 0000000..a276a75 --- /dev/null +++ b/crates/lang/src/parser/ast.rs @@ -0,0 +1,36 @@ +use std::collections::{BTreeMap, HashMap}; + +use indexmap::IndexMap; + +use super::Spanned; + +#[derive(Debug, PartialEq, Eq)] +pub struct File<'src> { + pub decls: IndexMap, Spanned>>, +} + +#[derive(Debug, PartialEq, Eq)] +pub enum Expr<'src> { + Node( + Spanned<&'src str>, + Option, Expr<'src>>>>, + ), + SimplePipe(Box>, Box>), + NamingPipe( + Box>, + (Vec>, Vec>), + Box>, + ), + MappingPipe(Box>, Box>), + NullPipe(Box>, Box>), + MultiPipe(IndexMap, Expr<'src>>), + LetIn( + IndexMap, Box>>, + Box>, + ), + // $ + Var(Spanned<&'src str>), + // @ + InputVar(Spanned<&'src str>), + AttrSet(Spanned, Expr<'src>>>), +} diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs index e21b961..40280e7 100644 --- a/crates/lang/src/tokens.rs +++ b/crates/lang/src/tokens.rs @@ -1,8 +1,15 @@ use logos::Logos; -#[derive(Logos, Debug, PartialEq, Eq)] +#[derive(Logos, Debug, PartialEq, Eq, Clone)] #[logos(skip r"[ \t\n\f]+")] pub enum Token<'a> { + // hack! + // this isn't actually supposed to be in the language. + // i just can't figure out how to automatically choose between a top level declaration + // or a top level expression + // so a declaration needs the keyword def until i can figure this out + #[token("def")] + Def, #[regex("[a-zA-Z0-9_\\-]+", |lex| lex.slice())] Word(&'a str), #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] @@ -27,6 +34,8 @@ pub enum Token<'a> { Equals, #[token(":")] Colon, + #[token(";")] + SemiColon, #[token("[")] BracketOpen, #[token("]")] diff --git a/crates/svg-filters/Cargo.toml b/crates/svg-filters/Cargo.toml index fbe3aaf..7f41e66 100644 --- a/crates/svg-filters/Cargo.toml +++ b/crates/svg-filters/Cargo.toml @@ -8,7 +8,7 @@ edition = "2021" [dependencies] csscolorparser = "0.6.2" indexmap = "2.2.5" -petgraph = "0.6.4" +petgraph = { workspace = true } quick-xml = { version = "0.31.0", features = ["serialize"] } [lints] diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index 2fc8df3..5ce0102 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -1,35 +1,8 @@ -use std::hint::black_box; - -use svg_filters::{ - codegen::SvgDocument, - types::{ - graph::edge::Edge, - nodes::{ - primitives::{ - blend::BlendMode, - color_matrix::ColorMatrixType, - turbulence::{NoiseType, StitchTiles, Turbulence}, - FePrimitive, - }, - standard_input::StandardInput, - }, - }, - Node, -}; +use svg_filters::codegen::SvgDocument; fn main() { let mut doc = SvgDocument::new(); - let noise = doc.create_filter("noise"); - - noise.add_node(Node::simple(FePrimitive::Turbulence(Turbulence { - base_frequency: (0.2, 0.2), - num_octaves: 1, - seed: 2, - stitch_tiles: StitchTiles::NoStitch, - noise_type: NoiseType::FractalNoise, - }))); - eprintln!("{}", doc.generate_svg_pretty()); println!("{}", doc.generate_svg()); } diff --git a/testfiles/test.owo b/testfiles/test.owo new file mode 100644 index 0000000..d9d05da --- /dev/null +++ b/testfiles/test.owo @@ -0,0 +1,4 @@ +def main = meow | test; +def test = meow [ hello: $foo, world: @bar]; + +def uwu = owo; From de008263ca37ca78018520b1e2a674092f97493c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 3 Apr 2024 00:28:45 +0200 Subject: [PATCH 102/189] lang: add test --- crates/lang/src/parser.rs | 109 +++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index b1034fa..10fa46e 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -125,10 +125,117 @@ mod tests { (5..32).into() )) ), - (0..0).into() + (0..32).into() ) )]) } ); } + + fn test_parse_multiple_top_level_complex() { + const INPUT: &str = r#"def main = meow + | uwu + [ foo: @bar + , hello: world @| test [ more: params ] | yay + ] + !| awa + @| nya + | rawr; + +def test = meow + [ hello: $foo + , world: @bar + ]; +"#; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([ + ( + ("main", (4..8).into()), + ( + Expr::SimplePipe( + Box::new(Expr::Node(("meow", (11..15).into()), None)), + Box::new(Expr::NullPipe( + Box::new(Expr::Node( + ("uwu", (20..23).into()), + Some(( + IndexMap::from_iter([ + ( + ("foo", (29..32).into()), + Expr::InputVar(("bar", (34..38).into())) + ), + ( + ("hello", (44..49).into()), + Expr::MappingPipe( + Box::new(Expr::Node( + ("world", (51..56).into()), + None + )), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node( + ("test", (60..64).into()), + Some(( + IndexMap::from_iter([( + ("more", (67..71).into()), + Expr::Node( + ( + "params", + (73..79).into() + ), + None + ) + )]), + (65..81).into() + )) + )), + Box::new(Expr::Node( + ("yay", (84..87).into()), + None + )) + )) + ) + ) + ]), + (27..92).into() + )) + )), + Box::new(Expr::MappingPipe( + Box::new(Expr::Node(("awa", (97..100).into()), None)), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node(("nya", (106..109).into()), None)), + Box::new(Expr::Node(("rawr", (114..118).into()), None)) + )) + )) + )) + ), + (11..118).into() + ), + ), + ( + ("test", (125..129).into()), + ( + Expr::Node( + ("meow", (132..136).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (141..146).into()), + Expr::Var(("foo", (148..152).into())) + ), + ( + ("world", (156..161).into()), + Expr::InputVar(("bar", (163..167).into())) + ) + ]), + (139..171).into() + )) + ), + (132..171).into() + ) + ) + ]) + } + ); + } } From ae60db77216343d7f259a733ccd2c1e53f95dd0c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 3 Apr 2024 00:30:11 +0200 Subject: [PATCH 103/189] lang: extract tests into file --- crates/lang/src/parser.rs | 152 +------------------------------- crates/lang/src/parser/tests.rs | 143 ++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 150 deletions(-) create mode 100644 crates/lang/src/parser/tests.rs diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 10fa46e..9641dbb 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -17,6 +17,8 @@ use logos::{Logos, Source}; use crate::tokens::Token; pub mod ast; +#[cfg(test)] +mod tests; use self::ast::{Expr, File}; type Span = SimpleSpan; @@ -89,153 +91,3 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src decls: IndexMap::from_iter(decls), })) } - -#[cfg(test)] -mod tests { - use crate::parser::ast::{Expr, File}; - use crate::parser::parse; - use crate::tokens::Token; - use chumsky::input::Stream; - use chumsky::prelude::*; - use indexmap::IndexMap; - use logos::Logos; - - #[test] - fn test_parse_node_with_params() { - const INPUT: &str = "meow [ hello: $foo, world: @bar]"; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([( - ("main", (0..0).into()), - ( - Expr::Node( - ("meow", (0..4).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (7..12).into()), - Expr::Var(("foo", (14..18).into())) - ), - ( - ("world", (20..25).into()), - Expr::InputVar(("bar", (27..31).into())) - ) - ]), - (5..32).into() - )) - ), - (0..32).into() - ) - )]) - } - ); - } - - fn test_parse_multiple_top_level_complex() { - const INPUT: &str = r#"def main = meow - | uwu - [ foo: @bar - , hello: world @| test [ more: params ] | yay - ] - !| awa - @| nya - | rawr; - -def test = meow - [ hello: $foo - , world: @bar - ]; -"#; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([ - ( - ("main", (4..8).into()), - ( - Expr::SimplePipe( - Box::new(Expr::Node(("meow", (11..15).into()), None)), - Box::new(Expr::NullPipe( - Box::new(Expr::Node( - ("uwu", (20..23).into()), - Some(( - IndexMap::from_iter([ - ( - ("foo", (29..32).into()), - Expr::InputVar(("bar", (34..38).into())) - ), - ( - ("hello", (44..49).into()), - Expr::MappingPipe( - Box::new(Expr::Node( - ("world", (51..56).into()), - None - )), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node( - ("test", (60..64).into()), - Some(( - IndexMap::from_iter([( - ("more", (67..71).into()), - Expr::Node( - ( - "params", - (73..79).into() - ), - None - ) - )]), - (65..81).into() - )) - )), - Box::new(Expr::Node( - ("yay", (84..87).into()), - None - )) - )) - ) - ) - ]), - (27..92).into() - )) - )), - Box::new(Expr::MappingPipe( - Box::new(Expr::Node(("awa", (97..100).into()), None)), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node(("nya", (106..109).into()), None)), - Box::new(Expr::Node(("rawr", (114..118).into()), None)) - )) - )) - )) - ), - (11..118).into() - ), - ), - ( - ("test", (125..129).into()), - ( - Expr::Node( - ("meow", (132..136).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (141..146).into()), - Expr::Var(("foo", (148..152).into())) - ), - ( - ("world", (156..161).into()), - Expr::InputVar(("bar", (163..167).into())) - ) - ]), - (139..171).into() - )) - ), - (132..171).into() - ) - ) - ]) - } - ); - } -} diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs new file mode 100644 index 0000000..308b09b --- /dev/null +++ b/crates/lang/src/parser/tests.rs @@ -0,0 +1,143 @@ +use crate::parser::ast::{Expr, File}; +use crate::parser::parse; +use crate::tokens::Token; +use chumsky::input::Stream; +use chumsky::prelude::*; +use indexmap::IndexMap; +use logos::Logos; + +#[test] +fn test_parse_node_with_params() { + const INPUT: &str = "meow [ hello: $foo, world: @bar]"; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([( + ("main", (0..0).into()), + ( + Expr::Node( + ("meow", (0..4).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (7..12).into()), + Expr::Var(("foo", (14..18).into())) + ), + ( + ("world", (20..25).into()), + Expr::InputVar(("bar", (27..31).into())) + ) + ]), + (5..32).into() + )) + ), + (0..32).into() + ) + )]) + } + ); +} + +fn test_parse_multiple_top_level_complex() { + const INPUT: &str = r#"def main = meow + | uwu + [ foo: @bar + , hello: world @| test [ more: params ] | yay + ] + !| awa + @| nya + | rawr; + +def test = meow + [ hello: $foo + , world: @bar + ]; +"#; + assert_eq!( + parse(INPUT).unwrap(), + File { + decls: IndexMap::from_iter([ + ( + ("main", (4..8).into()), + ( + Expr::SimplePipe( + Box::new(Expr::Node(("meow", (11..15).into()), None)), + Box::new(Expr::NullPipe( + Box::new(Expr::Node( + ("uwu", (20..23).into()), + Some(( + IndexMap::from_iter([ + ( + ("foo", (29..32).into()), + Expr::InputVar(("bar", (34..38).into())) + ), + ( + ("hello", (44..49).into()), + Expr::MappingPipe( + Box::new(Expr::Node( + ("world", (51..56).into()), + None + )), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node( + ("test", (60..64).into()), + Some(( + IndexMap::from_iter([( + ("more", (67..71).into()), + Expr::Node( + ("params", (73..79).into()), + None + ) + )]), + (65..81).into() + )) + )), + Box::new(Expr::Node( + ("yay", (84..87).into()), + None + )) + )) + ) + ) + ]), + (27..92).into() + )) + )), + Box::new(Expr::MappingPipe( + Box::new(Expr::Node(("awa", (97..100).into()), None)), + Box::new(Expr::SimplePipe( + Box::new(Expr::Node(("nya", (106..109).into()), None)), + Box::new(Expr::Node(("rawr", (114..118).into()), None)) + )) + )) + )) + ), + (11..118).into() + ), + ), + ( + ("test", (125..129).into()), + ( + Expr::Node( + ("meow", (132..136).into()), + Some(( + IndexMap::from_iter([ + ( + ("hello", (141..146).into()), + Expr::Var(("foo", (148..152).into())) + ), + ( + ("world", (156..161).into()), + Expr::InputVar(("bar", (163..167).into())) + ) + ]), + (139..171).into() + )) + ), + (132..171).into() + ) + ) + ]) + } + ); +} From 84448af7149c083812ea81f861fd4c67b79b0b3d Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 3 Apr 2024 17:00:20 +0200 Subject: [PATCH 104/189] lang: funky basic error reporting stuff --- Cargo.lock | 1 + crates/lang/Cargo.toml | 3 +- crates/lang/src/err_reporting.rs | 87 ++++++++++++++++++++++++++++++++ crates/lang/src/lib.rs | 4 +- crates/lang/src/main.rs | 21 ++++++-- crates/lang/src/parser.rs | 15 ++++-- crates/lang/src/parser/tests.rs | 4 +- testfiles/test.owo | 5 +- 8 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 crates/lang/src/err_reporting.rs diff --git a/Cargo.lock b/Cargo.lock index bc8692d..e762ead 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -503,6 +503,7 @@ dependencies = [ name = "lang" version = "0.1.0" dependencies = [ + "ariadne", "chumsky", "clap", "indexmap", diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 8126ffa..1cd8654 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -7,10 +7,11 @@ edition = "2021" [dependencies] logos = "0.14" -chumsky = "1.0.0-alpha.6" +chumsky = {version= "1.0.0-alpha.6", features=["label"]} petgraph = { workspace = true} indexmap = "2.2.6" clap = { version = "4", features = ["derive"] } +ariadne = "0.4.0" [lints] workspace = true diff --git a/crates/lang/src/err_reporting.rs b/crates/lang/src/err_reporting.rs new file mode 100644 index 0000000..ee66b7a --- /dev/null +++ b/crates/lang/src/err_reporting.rs @@ -0,0 +1,87 @@ +use std::{collections::HashMap, fs}; + +use ariadne::{sources, Label, Report, Source}; +use chumsky::{ + error::{self, Rich}, + ParseResult, +}; +use indexmap::IndexMap; + +use crate::{ + parser::{ast::File, Span}, + tokens::Token, +}; + +#[derive(Debug, PartialEq, Eq, Hash)] +pub enum Stage { + Lex, + Parse, +} + +impl Stage { + fn variants() -> [Stage; 2] { + [Stage::Lex, Stage::Parse] + } +} + +pub struct ErrorCollector<'filename, 'tokens, 'src> { + files: HashMap<&'filename str, &'src str>, + raw_errors: IndexMap<(&'filename str, Stage), Vec, Span>>>, +} + +impl<'filename, 'tokens, 'src> ErrorCollector<'filename, 'tokens, 'src> { + pub fn new(files: Vec<(&'filename str, &'src str)>) -> Self { + Self { + files: HashMap::from_iter(files.clone()), + raw_errors: files + .iter() + .flat_map(|(name, _)| Stage::variants().map(|s| (name, s))) + .map(|(name, stage)| ((*name, stage), Vec::new())) + .collect(), + } + } + + pub fn insert_many( + &mut self, + file: &'filename str, + curr_stage: Stage, + mut errs: Vec, Span>>, + ) { + let err_vec = self + .raw_errors + .get_mut(&(file, curr_stage)) + .expect("filename should exist"); + err_vec.append(&mut errs); + } + + pub fn analyze_and_report(self) { + let ErrorCollector { files, raw_errors } = self; + todo!() + } + + pub fn report_raw(self) { + let ErrorCollector { files, raw_errors } = self; + + for ((file, stage), errs) in raw_errors.into_iter() { + for err in errs { + Report::build(ariadne::ReportKind::Error, file, err.span().start) + .with_message(format!("error at stage {stage:?}, {:?}", err.reason())) + .with_label( + Label::new((file, err.span().into_range())).with_message(format!( + "found: {:?}", + err.found().expect("errors should have a reason") + )), + ) + .with_help(format!( + "expected: {:?}", + err.expected().collect::>() + )) + .finish() + .print((file, Source::from(files[file]))); + } + } + } +} + +#[derive(Debug, PartialEq, Eq)] +struct Loc<'filename>(&'filename str, Span); diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index 6878991..94a1430 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,5 +1,3 @@ +pub mod err_reporting; pub mod parser; pub mod tokens; -pub mod err_reporting { - pub struct GlobalReporter {} -} diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 3fef5ac..3e70973 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,17 +1,32 @@ use std::{fs, path::PathBuf}; use clap::Parser; -use lang::parser::parse; +use lang::{err_reporting::ErrorCollector, parser::parse}; #[derive(Parser)] struct Args { file: PathBuf, } +#[allow(clippy::unwrap_used)] fn main() { let args = Args::parse(); - let f = fs::read_to_string(args.file).expect("failed to read file"); + let n = args.file.clone(); + let f = fs::read_to_string(n.clone()).expect("failed to read file"); + let mut err_collector = ErrorCollector::new(vec![(n.to_str().unwrap(), &f)]); println!("file: {f}\n"); - println!("parsed: {:?}", parse(&f)) + let parse_res = parse(&f); + err_collector.insert_many( + args.file.to_str().unwrap(), + lang::err_reporting::Stage::Parse, + parse_res + .errors() + .into_iter() + .map(|e| e.to_owned()) + .collect::>(), + ); + + err_collector.report_raw(); + println!("res: {:?}", parse_res); } diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 9641dbb..aae1fbb 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -21,8 +21,8 @@ pub mod ast; mod tests; use self::ast::{Expr, File}; -type Span = SimpleSpan; -type Spanned = (T, Span); +pub type Span = SimpleSpan; +pub type Spanned = (T, Span); pub fn parse<'src>(src: &'src str) -> ParseResult, Rich<'_, Token<'_>>> { let toks: Vec<_> = Token::lexer(src) @@ -43,24 +43,29 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src Token::VarIdent(name) => (Expr::Var as fn(_) -> _, name), Token::InputIdent(name) => (Expr::InputVar as fn(_) -> _, name) } - .map_with(|(item_type, name), extra| item_type((name, extra.span()))); + .map_with(|(item_type, name), extra| item_type((name, extra.span()))) + .labelled("variable"); let attrset = word .map_with(|n, e| (n, e.span())) + .labelled("attr name") .then_ignore(just(Token::Colon)) .then(expr) + .labelled("attr body") .separated_by(just(Token::Comma)) .collect::>() .map(IndexMap::from_iter) .delimited_by(just(Token::BracketOpen), just(Token::BracketClose)) - .map_with(|v, e| (v, e.span())); + .map_with(|v, e| (v, e.span())) + .labelled("attrset"); let node = word .map_with(|v, e| (v, e.span())) .then(attrset.clone().or_not()) .map(|(name, params)| Expr::Node(name, params)) .or(var) - .or(attrset.map(Expr::AttrSet)); + .or(attrset.map(Expr::AttrSet)) + .labelled("node"); let pipeline = node .clone() diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs index 308b09b..f8fbdc0 100644 --- a/crates/lang/src/parser/tests.rs +++ b/crates/lang/src/parser/tests.rs @@ -39,7 +39,7 @@ fn test_parse_node_with_params() { } fn test_parse_multiple_top_level_complex() { - const INPUT: &str = r#"def main = meow + const INPUT: &str = r"def main = meow | uwu [ foo: @bar , hello: world @| test [ more: params ] | yay @@ -52,7 +52,7 @@ def test = meow [ hello: $foo , world: @bar ]; -"#; +"; assert_eq!( parse(INPUT).unwrap(), File { diff --git a/testfiles/test.owo b/testfiles/test.owo index d9d05da..d35cae5 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1 @@ -def main = meow | test; -def test = meow [ hello: $foo, world: @bar]; - -def uwu = owo; +meow gay | uwu From ace69b0094e454ff3617300d17cb2b7ef6870e96 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 3 Apr 2024 20:08:33 +0200 Subject: [PATCH 105/189] svg-filters: format matrices in complex test --- crates/svg-filters/src/tests/complex.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/svg-filters/src/tests/complex.rs b/crates/svg-filters/src/tests/complex.rs index 9b28304..2936bb4 100644 --- a/crates/svg-filters/src/tests/complex.rs +++ b/crates/svg-filters/src/tests/complex.rs @@ -11,7 +11,10 @@ fn test_chrom_abb() { let chan_r = chromabb.color_matrix( StandardInput::SourceGraphic, ColorMatrixType::Matrix(Box::new([ - 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + 1., 0., 0., 0., 0., // + 0., 0., 0., 0., 0., // + 0., 0., 0., 0., 0., // + 0., 0., 0., 1., 0., ])), ); let offset_r = chromabb.offset(chan_r, 25., 0.); @@ -20,7 +23,10 @@ fn test_chrom_abb() { let chan_b = chromabb.color_matrix( StandardInput::SourceGraphic, ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 1., 0., + 0., 0., 0., 0., 0., // + 0., 0., 0., 0., 0., // + 0., 0., 1., 0., 0., // + 0., 0., 0., 1., 0., ])), ); let offset_b = chromabb.offset(chan_b, -25., 0.); @@ -31,7 +37,10 @@ fn test_chrom_abb() { let chan_g = chromabb.color_matrix( StandardInput::SourceGraphic, ColorMatrixType::Matrix(Box::new([ - 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., + 0., 0., 0., 0., 0., // + 0., 1., 0., 0., 0., // + 0., 0., 0., 0., 0., // + 0., 0., 0., 1., 0., ])), ); chromabb.composite_arithmetic(composite_rb, chan_g, 0., 1., 1., 0.); From b6e304fa784a2b331769456bf98b1f183adc9546 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 7 Apr 2024 00:55:12 +0200 Subject: [PATCH 106/189] lang: rework ast structure --- crates/lang/src/err_reporting.rs | 1 + crates/lang/src/parser.rs | 47 ++++-- crates/lang/src/parser/ast.rs | 40 +++-- crates/lang/src/parser/tests.rs | 266 +++++++++++++++---------------- testfiles/test.owo | 19 ++- 5 files changed, 209 insertions(+), 164 deletions(-) diff --git a/crates/lang/src/err_reporting.rs b/crates/lang/src/err_reporting.rs index ee66b7a..ebf7866 100644 --- a/crates/lang/src/err_reporting.rs +++ b/crates/lang/src/err_reporting.rs @@ -64,6 +64,7 @@ impl<'filename, 'tokens, 'src> ErrorCollector<'filename, 'tokens, 'src> { for ((file, stage), errs) in raw_errors.into_iter() { for err in errs { + eprintln!("e: {err:?}"); Report::build(ariadne::ReportKind::Error, file, err.span().start) .with_message(format!("error at stage {stage:?}, {:?}", err.reason())) .with_label( diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index aae1fbb..8843d11 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -2,14 +2,12 @@ use std::ops::Range; use chumsky::{ error::Rich, - extra, input::{Stream, ValueInput}, prelude::*, primitive::just, recursive::recursive, - select, span::SimpleSpan, - IterParser, Parser, + IterParser, }; use indexmap::IndexMap; use logos::{Logos, Source}; @@ -19,7 +17,7 @@ use crate::tokens::Token; pub mod ast; #[cfg(test)] mod tests; -use self::ast::{Expr, File}; +use self::ast::{Expr, Expression, File}; pub type Span = SimpleSpan; pub type Spanned = (T, Span); @@ -31,11 +29,13 @@ pub fn parse<'src>(src: &'src str) -> ParseResult, Rich<'_, Token<'_>>> .map(|(t, s)| (t.expect("TODO: add lexer error(s)"), Span::from(s))) .collect(); let tok_stream = Stream::from_iter(toks).spanned((src.len()..src.len()).into()); - expr_parser().parse(tok_stream) + parser().parse(tok_stream) } - -fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src>, Span = Span>>( -) -> impl Parser<'tokens, I, File<'src>, extra::Err, Span>>> { +pub(crate) fn parser< + 'tokens, + 'src: 'tokens, + I: ValueInput<'tokens, Token = Token<'src>, Span = Span>, +>() -> impl Parser<'tokens, I, File<'src>, extra::Err, Span>>> { let word = select! { Token::Word(word) => word }; let expr = recursive(|expr| { @@ -43,7 +43,7 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src Token::VarIdent(name) => (Expr::Var as fn(_) -> _, name), Token::InputIdent(name) => (Expr::InputVar as fn(_) -> _, name) } - .map_with(|(item_type, name), extra| item_type((name, extra.span()))) + .map_with(|(item_type, name), extra| Expression::new(item_type(name), extra.span())) .labelled("variable"); let attrset = word @@ -62,11 +62,15 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src let node = word .map_with(|v, e| (v, e.span())) .then(attrset.clone().or_not()) - .map(|(name, params)| Expr::Node(name, params)) + .map_with(|(name, params), extra| { + Expression::new(Expr::Node(name, params), extra.span()) + }) .or(var) - .or(attrset.map(Expr::AttrSet)) + .or(attrset + .map_with(|attrset, extra| Expression::new(Expr::AttrSet(attrset), extra.span()))) .labelled("node"); + #[allow(clippy::let_and_return)] let pipeline = node .clone() .then(choice(( @@ -75,8 +79,8 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src just(Token::NullPipe).to(Expr::NullPipe as fn(_, _) -> _), ))) .repeated() - .foldr(node, |(curr, pipe), next| { - pipe(Box::new(curr), Box::new(next)) + .foldr_with(node, |(curr, pipe), next, extra| { + Expression::new(pipe(Box::new(curr), Box::new(next)), extra.span()) }); pipeline @@ -85,14 +89,25 @@ fn expr_parser<'tokens, 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src let decl = just(Token::Def).ignore_then( word.map_with(|n, e| (n, e.span())) .then_ignore(just(Token::Equals)) - .then(expr.clone().map_with(|expr, extra| (expr, extra.span()))) + .then(expr.clone().map(|expr| expr)) .then_ignore(just(Token::SemiColon)), ); - expr.map_with(|expr, extra| File { - decls: IndexMap::from_iter([(("main", (0..0).into()), (expr, extra.span()))]), + expr.map(|expr| File { + decls: IndexMap::from_iter([(("main", (0..0).into()), expr)]), }) .or(decl.repeated().collect::>().map(|decls| File { decls: IndexMap::from_iter(decls), })) } +pub mod asg { + use std::collections::BTreeMap; + + use petgraph::{adj::NodeIndex, data::Build, graph::DiGraph}; + + use super::{ast::Expr, Spanned}; + + pub struct Asg<'src> { + ast: Expr<'src>, + } +} diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs index a276a75..e58c5aa 100644 --- a/crates/lang/src/parser/ast.rs +++ b/crates/lang/src/parser/ast.rs @@ -2,35 +2,47 @@ use std::collections::{BTreeMap, HashMap}; use indexmap::IndexMap; -use super::Spanned; +use super::{Span, Spanned}; #[derive(Debug, PartialEq, Eq)] pub struct File<'src> { - pub decls: IndexMap, Spanned>>, + pub decls: IndexMap, Expression<'src>>, +} + +#[derive(Debug, PartialEq, Eq)] +pub struct Expression<'src> { + pub expr: Expr<'src>, + pub span: Span, +} + +impl<'src> Expression<'src> { + pub fn new(expr: Expr<'src>, span: Span) -> Self { + Self { expr, span } + } } #[derive(Debug, PartialEq, Eq)] pub enum Expr<'src> { Node( Spanned<&'src str>, - Option, Expr<'src>>>>, + Option, Expression<'src>>>>, ), - SimplePipe(Box>, Box>), + SimplePipe(Box>, Box>), NamingPipe( - Box>, + Box>, (Vec>, Vec>), - Box>, + Box>, ), - MappingPipe(Box>, Box>), - NullPipe(Box>, Box>), - MultiPipe(IndexMap, Expr<'src>>), + MappingPipe(Box>, Box>), + NullPipe(Box>, Box>), + MultiPipe(IndexMap, Expression<'src>>), LetIn( - IndexMap, Box>>, - Box>, + IndexMap, Box>>, + Box>, ), // $ - Var(Spanned<&'src str>), + Var(&'src str), // @ - InputVar(Spanned<&'src str>), - AttrSet(Spanned, Expr<'src>>>), + InputVar(&'src str), + AttrSet(Spanned, Expression<'src>>>), } diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs index f8fbdc0..2bd2779 100644 --- a/crates/lang/src/parser/tests.rs +++ b/crates/lang/src/parser/tests.rs @@ -6,138 +6,138 @@ use chumsky::prelude::*; use indexmap::IndexMap; use logos::Logos; -#[test] -fn test_parse_node_with_params() { - const INPUT: &str = "meow [ hello: $foo, world: @bar]"; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([( - ("main", (0..0).into()), - ( - Expr::Node( - ("meow", (0..4).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (7..12).into()), - Expr::Var(("foo", (14..18).into())) - ), - ( - ("world", (20..25).into()), - Expr::InputVar(("bar", (27..31).into())) - ) - ]), - (5..32).into() - )) - ), - (0..32).into() - ) - )]) - } - ); -} +// #[test] +// fn test_parse_node_with_params() { +// const INPUT: &str = "meow [ hello: $foo, world: @bar]"; +// assert_eq!( +// parse(INPUT).unwrap(), +// File { +// decls: IndexMap::from_iter([( +// ("main", (0..0).into()), +// ( +// Expr::Node( +// ("meow", (0..4).into()), +// Some(( +// IndexMap::from_iter([ +// ( +// ("hello", (7..12).into()), +// Expr::Var(("foo", (14..18).into())) +// ), +// ( +// ("world", (20..25).into()), +// Expr::InputVar(("bar", (27..31).into())) +// ) +// ]), +// (5..32).into() +// )) +// ), +// (0..32).into() +// ) +// )]) +// } +// ); +// } -fn test_parse_multiple_top_level_complex() { - const INPUT: &str = r"def main = meow - | uwu - [ foo: @bar - , hello: world @| test [ more: params ] | yay - ] - !| awa - @| nya - | rawr; +// fn test_parse_multiple_top_level_complex() { +// const INPUT: &str = r"def main = meow +// | uwu +// [ foo: @bar +// , hello: world @| test [ more: params ] | yay +// ] +// !| awa +// @| nya +// | rawr; -def test = meow - [ hello: $foo - , world: @bar - ]; -"; - assert_eq!( - parse(INPUT).unwrap(), - File { - decls: IndexMap::from_iter([ - ( - ("main", (4..8).into()), - ( - Expr::SimplePipe( - Box::new(Expr::Node(("meow", (11..15).into()), None)), - Box::new(Expr::NullPipe( - Box::new(Expr::Node( - ("uwu", (20..23).into()), - Some(( - IndexMap::from_iter([ - ( - ("foo", (29..32).into()), - Expr::InputVar(("bar", (34..38).into())) - ), - ( - ("hello", (44..49).into()), - Expr::MappingPipe( - Box::new(Expr::Node( - ("world", (51..56).into()), - None - )), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node( - ("test", (60..64).into()), - Some(( - IndexMap::from_iter([( - ("more", (67..71).into()), - Expr::Node( - ("params", (73..79).into()), - None - ) - )]), - (65..81).into() - )) - )), - Box::new(Expr::Node( - ("yay", (84..87).into()), - None - )) - )) - ) - ) - ]), - (27..92).into() - )) - )), - Box::new(Expr::MappingPipe( - Box::new(Expr::Node(("awa", (97..100).into()), None)), - Box::new(Expr::SimplePipe( - Box::new(Expr::Node(("nya", (106..109).into()), None)), - Box::new(Expr::Node(("rawr", (114..118).into()), None)) - )) - )) - )) - ), - (11..118).into() - ), - ), - ( - ("test", (125..129).into()), - ( - Expr::Node( - ("meow", (132..136).into()), - Some(( - IndexMap::from_iter([ - ( - ("hello", (141..146).into()), - Expr::Var(("foo", (148..152).into())) - ), - ( - ("world", (156..161).into()), - Expr::InputVar(("bar", (163..167).into())) - ) - ]), - (139..171).into() - )) - ), - (132..171).into() - ) - ) - ]) - } - ); -} +// def test = meow +// [ hello: $foo +// , world: @bar +// ]; +// "; +// assert_eq!( +// parse(INPUT).unwrap(), +// File { +// decls: IndexMap::from_iter([ +// ( +// ("main", (4..8).into()), +// ( +// Expr::SimplePipe( +// Box::new(Expr::Node(("meow", (11..15).into()), None)), +// Box::new(Expr::NullPipe( +// Box::new(Expr::Node( +// ("uwu", (20..23).into()), +// Some(( +// IndexMap::from_iter([ +// ( +// ("foo", (29..32).into()), +// Expr::InputVar(("bar", (34..38).into())) +// ), +// ( +// ("hello", (44..49).into()), +// Expr::MappingPipe( +// Box::new(Expr::Node( +// ("world", (51..56).into()), +// None +// )), +// Box::new(Expr::SimplePipe( +// Box::new(Expr::Node( +// ("test", (60..64).into()), +// Some(( +// IndexMap::from_iter([( +// ("more", (67..71).into()), +// Expr::Node( +// ("params", (73..79).into()), +// None +// ) +// )]), +// (65..81).into() +// )) +// )), +// Box::new(Expr::Node( +// ("yay", (84..87).into()), +// None +// )) +// )) +// ) +// ) +// ]), +// (27..92).into() +// )) +// )), +// Box::new(Expr::MappingPipe( +// Box::new(Expr::Node(("awa", (97..100).into()), None)), +// Box::new(Expr::SimplePipe( +// Box::new(Expr::Node(("nya", (106..109).into()), None)), +// Box::new(Expr::Node(("rawr", (114..118).into()), None)) +// )) +// )) +// )) +// ), +// (11..118).into() +// ), +// ), +// ( +// ("test", (125..129).into()), +// ( +// Expr::Node( +// ("meow", (132..136).into()), +// Some(( +// IndexMap::from_iter([ +// ( +// ("hello", (141..146).into()), +// Expr::Var(("foo", (148..152).into())) +// ), +// ( +// ("world", (156..161).into()), +// Expr::InputVar(("bar", (163..167).into())) +// ) +// ]), +// (139..171).into() +// )) +// ), +// (132..171).into() +// ) +// ) +// ]) +// } +// ); +// } diff --git a/testfiles/test.owo b/testfiles/test.owo index d35cae5..f767d2a 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1,18 @@ -meow gay | uwu +def main = meow + | uwu + [ foo: @bar + , hello: world @| test [ more: params ] | yay + ] + !| awa + @| nya + | rawr; + +def test = meow + [ hello: $foo + , world: @bar + ]; + +def blah = [ + pipe1: meow | uwu, + pipe2: lorem | ipsum +] | flkjdsafkjl; From 8d7401531e4633163e2ec2fd2eb14d7efd85a73c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 7 Apr 2024 01:04:02 +0200 Subject: [PATCH 107/189] lang: some small, unfinished stuff --- crates/lang/src/parser.rs | 11 ----------- crates/lang/src/parser/ast.rs | 18 +++++++++--------- crates/lang/src/tokens.rs | 4 ++++ 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 8843d11..8422bc0 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -100,14 +100,3 @@ pub(crate) fn parser< decls: IndexMap::from_iter(decls), })) } -pub mod asg { - use std::collections::BTreeMap; - - use petgraph::{adj::NodeIndex, data::Build, graph::DiGraph}; - - use super::{ast::Expr, Spanned}; - - pub struct Asg<'src> { - ast: Expr<'src>, - } -} diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs index e58c5aa..02ce0ae 100644 --- a/crates/lang/src/parser/ast.rs +++ b/crates/lang/src/parser/ast.rs @@ -28,18 +28,18 @@ pub enum Expr<'src> { Option, Expression<'src>>>>, ), SimplePipe(Box>, Box>), - NamingPipe( - Box>, - (Vec>, Vec>), - Box>, - ), + // NamingPipe( + // Box>, + // (Vec>, Vec>), + // Box>, + // ), MappingPipe(Box>, Box>), NullPipe(Box>, Box>), MultiPipe(IndexMap, Expression<'src>>), - LetIn( - IndexMap, Box>>, - Box>, - ), + // LetIn( + // IndexMap, Box>>, + // Box>, + // ), // $ Var(&'src str), // @ diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs index 40280e7..e881663 100644 --- a/crates/lang/src/tokens.rs +++ b/crates/lang/src/tokens.rs @@ -10,6 +10,10 @@ pub enum Token<'a> { // so a declaration needs the keyword def until i can figure this out #[token("def")] Def, + #[token("let")] + Let, + #[token("in")] + In, #[regex("[a-zA-Z0-9_\\-]+", |lex| lex.slice())] Word(&'a str), #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] From 198c74c7ae4a6ffd3b82a3fd0368495686addcb7 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Apr 2024 14:04:52 +0200 Subject: [PATCH 108/189] lang: make attrset delims braces --- crates/lang/src/parser.rs | 17 +++++++++++++++-- testfiles/test.owo | 14 +++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 8422bc0..8090f7b 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -25,7 +25,6 @@ pub type Spanned = (T, Span); pub fn parse<'src>(src: &'src str) -> ParseResult, Rich<'_, Token<'_>>> { let toks: Vec<_> = Token::lexer(src) .spanned() - .into_iter() .map(|(t, s)| (t.expect("TODO: add lexer error(s)"), Span::from(s))) .collect(); let tok_stream = Stream::from_iter(toks).spanned((src.len()..src.len()).into()); @@ -55,7 +54,7 @@ pub(crate) fn parser< .separated_by(just(Token::Comma)) .collect::>() .map(IndexMap::from_iter) - .delimited_by(just(Token::BracketOpen), just(Token::BracketClose)) + .delimited_by(just(Token::BraceOpen), just(Token::BraceClose)) .map_with(|v, e| (v, e.span())) .labelled("attrset"); @@ -100,3 +99,17 @@ pub(crate) fn parser< decls: IndexMap::from_iter(decls), })) } + +pub mod asg { + use petgraph::graph::DiGraph; + + use super::Spanned; + + pub struct Asg<'src> { + graph: DiGraph, String>, + } + + enum AsgNode<'src> { + Node(Spanned<&'src str>), + } +} diff --git a/testfiles/test.owo b/testfiles/test.owo index f767d2a..11930d6 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,18 +1,18 @@ def main = meow | uwu - [ foo: @bar - , hello: world @| test [ more: params ] | yay - ] + { foo: @bar + , hello: world @| test { more: params } | yay + } !| awa @| nya | rawr; def test = meow - [ hello: $foo + { hello: $foo , world: @bar - ]; + }; -def blah = [ +def blah = { pipe1: meow | uwu, pipe2: lorem | ipsum -] | flkjdsafkjl; +} | flkjdsafkjl; From bfd4b3765f35a98112b691d2f29c2c3446fe4d5c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Apr 2024 15:43:42 +0200 Subject: [PATCH 109/189] lang: state with confusing error --- crates/lang/src/parser.rs | 4 ++++ crates/lang/src/parser/ast.rs | 15 ++++++++++--- crates/lang/src/tokens.rs | 18 +++++++++++++++- crates/lang/src/tokens/tests.rs | 38 ++++++++++++++++++++++++++++++--- testfiles/test.owo | 23 ++++++-------------- 5 files changed, 74 insertions(+), 24 deletions(-) diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 8090f7b..7c0e406 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -38,6 +38,10 @@ pub(crate) fn parser< let word = select! { Token::Word(word) => word }; let expr = recursive(|expr| { + let lit = select! { + Token::Int(i) = e => Expression::new(Expr::Lit(ast::Lit::Int(i.parse().unwrap())), e.span()), + Token::Float(f) = e => Expression::new(Expr::Lit(ast::Lit::Float(f.parse().unwrap())), e.span()), + }; let var = select! { Token::VarIdent(name) => (Expr::Var as fn(_) -> _, name), Token::InputIdent(name) => (Expr::InputVar as fn(_) -> _, name) diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs index 02ce0ae..d21ad49 100644 --- a/crates/lang/src/parser/ast.rs +++ b/crates/lang/src/parser/ast.rs @@ -4,12 +4,12 @@ use indexmap::IndexMap; use super::{Span, Spanned}; -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq)] pub struct File<'src> { pub decls: IndexMap, Expression<'src>>, } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq)] pub struct Expression<'src> { pub expr: Expr<'src>, pub span: Span, @@ -21,7 +21,7 @@ impl<'src> Expression<'src> { } } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq)] pub enum Expr<'src> { Node( Spanned<&'src str>, @@ -45,4 +45,13 @@ pub enum Expr<'src> { // @ InputVar(&'src str), AttrSet(Spanned, Expression<'src>>>), + Lit(Lit<'src>), +} + +#[derive(Debug, PartialEq)] +pub enum Lit<'src> { + // TODO: more bigger better number types + Int(i64), + Float(f64), + String(&'src str), } diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs index e881663..6caa57c 100644 --- a/crates/lang/src/tokens.rs +++ b/crates/lang/src/tokens.rs @@ -14,7 +14,23 @@ pub enum Token<'a> { Let, #[token("in")] In, - #[regex("[a-zA-Z0-9_\\-]+", |lex| lex.slice())] + #[regex("[\\d]+", |lex| lex.slice())] + Int(&'a str), + #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)", |lex| lex.slice())] + Float(&'a str), + // TODO: more bigger better more complex string lexing + // TODO: templating? + #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#, |lex| lex.slice())] + String(&'a str), + #[token("+")] + Plus, + #[token("-")] + Minus, + #[token("*")] + Mult, + #[token("/")] + Div, + #[regex("[a-zA-Z_]+[a-zA-Z0-9_\\-]*", |lex| lex.slice())] Word(&'a str), #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] VarIdent(&'a str), diff --git a/crates/lang/src/tokens/tests.rs b/crates/lang/src/tokens/tests.rs index fe4270e..2b0454f 100644 --- a/crates/lang/src/tokens/tests.rs +++ b/crates/lang/src/tokens/tests.rs @@ -34,7 +34,7 @@ lexer_test! { lexer_test! { test_lex_subgroup, - "subgroup(first, second) = a | b { 1: $first } | c { 1: $second }", + "subgroup(first, second) = a | b { in1: $first } | c { in1: $second }", [ Token::Word("subgroup"), Token::ParenOpen, @@ -47,14 +47,14 @@ lexer_test! { Token::Pipe, Token::Word("b"), Token::BraceOpen, - Token::Word("1"), + Token::Word("in1"), Token::Colon, Token::VarIdent("first"), Token::BraceClose, Token::Pipe, Token::Word("c"), Token::BraceOpen, - Token::Word("1"), + Token::Word("in1"), Token::Colon, Token::VarIdent("second"), Token::BraceClose @@ -105,3 +105,35 @@ lexer_test! { Token::Word("c") ] } + +lexer_test! { + test_lex_int_literal, + "42", + [ + Token::Int("42") + ] +} + +lexer_test! { + test_lex_float_literal_0, + "1.5", + [ + Token::Float("1.5") + ] +} + +lexer_test! { + test_lex_float_literal_1, + "42.", + [ + Token::Float("42.") + ] +} + +lexer_test! { + test_lex_float_literal_2, + ".42", + [ + Token::Float(".42") + ] +} diff --git a/testfiles/test.owo b/testfiles/test.owo index 11930d6..809a6e1 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,18 +1,7 @@ -def main = meow - | uwu - { foo: @bar - , hello: world @| test { more: params } | yay - } - !| awa - @| nya - | rawr; +def blend1 = [ + open "test.png", + open "test2.png" + ] + | blend multiply 0.6 -def test = meow - { hello: $foo - , world: @bar - }; - -def blah = { - pipe1: meow | uwu, - pipe2: lorem | ipsum -} | flkjdsafkjl; +def blend2 = open "test.png" | blend multiply 0.6 [ open test2.png ] From 881a987b2f9ce45955e99ac4b19b828a897ae326 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Apr 2024 23:27:56 +0200 Subject: [PATCH 110/189] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'devenv': 'github:cachix/devenv/18ef9849d1ecac7a9a7920eb4f2e4adcf67a8c3a' (2024-01-09) → 'github:cachix/devenv/a71323c618664a6b7a39bc183b0ce22ac8511cf9' (2024-04-08) • Added input 'devenv/cachix': 'github:cachix/cachix/661bbb7f8b55722a0406456b15267b5426a3bda6' (2024-03-15) • Added input 'devenv/cachix/devenv': 'github:cachix/devenv/2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196' (2024-02-23) • Added input 'devenv/cachix/devenv/flake-compat': follows 'devenv/cachix/flake-compat' • Added input 'devenv/cachix/devenv/nix': 'github:domenkozar/nix/ecd0af0c1f56de32cbad14daa1d82a132bf298f8' (2024-02-22) • Added input 'devenv/cachix/devenv/nix/flake-compat': 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17) • Added input 'devenv/cachix/devenv/nix/nixpkgs': follows 'devenv/cachix/devenv/nixpkgs' • Added input 'devenv/cachix/devenv/nix/nixpkgs-regression': 'github:NixOS/nixpkgs/215d4d0fd80ca5163643b03a33fde804a29cc1e2' (2022-01-24) • Added input 'devenv/cachix/devenv/nixpkgs': 'github:NixOS/nixpkgs/9201b5ff357e781bf014d0330d18555695df7ba8' (2023-08-23) • Added input 'devenv/cachix/devenv/poetry2nix': 'github:nix-community/poetry2nix/d5006be9c2c2417dafb2e2e5034d83fabd207ee3' (2023-08-24) • Added input 'devenv/cachix/devenv/poetry2nix/flake-utils': 'github:numtide/flake-utils/919d646de7be200f3bf08cb76ae1f09402b6f9b4' (2023-07-11) • Added input 'devenv/cachix/devenv/poetry2nix/flake-utils/systems': 'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09) • Added input 'devenv/cachix/devenv/poetry2nix/nix-github-actions': 'github:nix-community/nix-github-actions/165b1650b753316aa7f1787f3005a8d2da0f5301' (2023-07-09) • Added input 'devenv/cachix/devenv/poetry2nix/nix-github-actions/nixpkgs': follows 'devenv/cachix/devenv/poetry2nix/nixpkgs' • Added input 'devenv/cachix/devenv/poetry2nix/nixpkgs': follows 'devenv/cachix/devenv/nixpkgs' • Added input 'devenv/cachix/devenv/pre-commit-hooks': follows 'devenv/cachix/pre-commit-hooks' • Added input 'devenv/cachix/flake-compat': 'github:edolstra/flake-compat/0f9255e01c2351cc7d116c072cb317785dd33b33' (2023-10-04) • Added input 'devenv/cachix/nixpkgs': follows 'devenv/nixpkgs' • Added input 'devenv/cachix/pre-commit-hooks': 'github:cachix/pre-commit-hooks.nix/5df5a70ad7575f6601d91f0efec95dd9bc619431' (2024-02-15) • Added input 'devenv/cachix/pre-commit-hooks/flake-compat': 'github:edolstra/flake-compat/0f9255e01c2351cc7d116c072cb317785dd33b33' (2023-10-04) • Added input 'devenv/cachix/pre-commit-hooks/flake-utils': 'github:numtide/flake-utils/4022d587cbbfd70fe950c1e2083a02621806a725' (2023-12-04) • Added input 'devenv/cachix/pre-commit-hooks/flake-utils/systems': 'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09) • Added input 'devenv/cachix/pre-commit-hooks/gitignore': 'github:hercules-ci/gitignore.nix/43e1aa1308018f37118e34d3a9cb4f5e75dc11d5' (2023-12-29) • Added input 'devenv/cachix/pre-commit-hooks/gitignore/nixpkgs': follows 'devenv/cachix/pre-commit-hooks/nixpkgs' • Added input 'devenv/cachix/pre-commit-hooks/nixpkgs': follows 'devenv/cachix/nixpkgs' • Added input 'devenv/cachix/pre-commit-hooks/nixpkgs-stable': 'github:NixOS/nixpkgs/3dc440faeee9e889fe2d1b4d25ad0f430d449356' (2024-01-10) • Updated input 'devenv/flake-compat': 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17) → 'github:edolstra/flake-compat/0f9255e01c2351cc7d116c072cb317785dd33b33' (2023-10-04) • Updated input 'devenv/nix': 'github:domenkozar/nix/7c91803598ffbcfe4a55c44ac6d49b2cf07a527f' (2023-02-16) → 'github:domenkozar/nix/c5bbf14ecbd692eeabf4184cc8d50f79c2446549' (2024-03-15) • Added input 'devenv/nix/flake-compat': 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17) • Removed input 'devenv/nix/lowdown-src' • Updated input 'devenv/nixpkgs': 'github:NixOS/nixpkgs/126f49a01de5b7e35a43fd43f891ecf6d3a51459' (2023-03-15) → 'github:cachix/devenv-nixpkgs/829e73affeadfb4198a7105cbe3a03153d13edc9' (2024-03-12) • Updated input 'devenv/pre-commit-hooks': 'github:cachix/pre-commit-hooks.nix/ea96f0c05924341c551a797aaba8126334c505d2' (2024-01-08) → 'github:cachix/pre-commit-hooks.nix/e35aed5fda3cc79f88ed7f1795021e559582093a' (2024-04-02) • Updated input 'devenv/pre-commit-hooks/flake-utils': 'github:numtide/flake-utils/a1720a10a6cfe8234c0e93907ffe81be440f4cef' (2023-05-31) → 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a' (2024-03-11) • Updated input 'devenv/pre-commit-hooks/gitignore': 'github:hercules-ci/gitignore.nix/a20de23b925fd8264fd7fad6454652e142fd7f73' (2022-08-14) → 'github:hercules-ci/gitignore.nix/637db329424fd7e46cf4185293b9cc8c88c95394' (2024-02-28) • Updated input 'devenv/pre-commit-hooks/nixpkgs-stable': 'github:NixOS/nixpkgs/c37ca420157f4abc31e26f436c1145f8951ff373' (2023-06-03) → 'github:NixOS/nixpkgs/614b4613980a522ba49f0d194531beddbb7220d3' (2024-03-17) • Updated input 'fenix': 'github:nix-community/fenix/93e89638c15512db65e931f26ce36edf8cfbb4a5' (2024-01-10) → 'github:nix-community/fenix/99c6241db5ca5363c05c8f4acbdf3a4e8fc42844' (2024-04-06) • Updated input 'fenix/nixpkgs': 'github:nixos/nixpkgs/46ae0210ce163b3cba6c7da08840c1d63de9c701' (2024-01-06) → 'github:nixos/nixpkgs/fd281bd6b7d3e32ddfa399853946f782553163b5' (2024-04-03) • Updated input 'fenix/rust-analyzer-src': 'github:rust-lang/rust-analyzer/ae6e73772432cfe35bb0ff6de6fdcfa908642b67' (2024-01-09) → 'github:rust-lang/rust-analyzer/8e581ac348e223488622f4d3003cb2bd412bf27e' (2024-04-03) • Updated input 'nixpkgs': 'github:NixOS/nixpkgs/317484b1ead87b9c1b8ac5261a8d2dd748a0492d' (2024-01-08) → 'github:NixOS/nixpkgs/ff0dbd94265ac470dda06a657d5fe49de93b4599' (2024-04-06) --- flake.lock | 468 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 405 insertions(+), 63 deletions(-) diff --git a/flake.lock b/flake.lock index fd2920d..43f154e 100644 --- a/flake.lock +++ b/flake.lock @@ -1,18 +1,43 @@ { "nodes": { - "devenv": { + "cachix": { "inputs": { - "flake-compat": "flake-compat", - "nix": "nix", - "nixpkgs": "nixpkgs", + "devenv": "devenv_2", + "flake-compat": "flake-compat_2", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1704835383, - "narHash": "sha256-SoC0rYR9iHW0dVOEmxNEfa8vk9dTK86P5iXTgHafmwM=", + "lastModified": 1710475558, + "narHash": "sha256-egKrPCKjy/cE+NqCj4hg2fNX/NwLCf0bRDInraYXDgs=", + "owner": "cachix", + "repo": "cachix", + "rev": "661bbb7f8b55722a0406456b15267b5426a3bda6", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, + "devenv": { + "inputs": { + "cachix": "cachix", + "flake-compat": "flake-compat_4", + "nix": "nix_2", + "nixpkgs": "nixpkgs_2", + "pre-commit-hooks": "pre-commit-hooks_2" + }, + "locked": { + "lastModified": 1712579011, + "narHash": "sha256-trHgFNW8CW85c1OuAPBI+OGous53KkVhMemvcq7syDo=", "owner": "cachix", "repo": "devenv", - "rev": "18ef9849d1ecac7a9a7920eb4f2e4adcf67a8c3a", + "rev": "a71323c618664a6b7a39bc183b0ce22ac8511cf9", "type": "github" }, "original": { @@ -21,17 +46,48 @@ "type": "github" } }, + "devenv_2": { + "inputs": { + "flake-compat": [ + "devenv", + "cachix", + "flake-compat" + ], + "nix": "nix", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix", + "pre-commit-hooks": [ + "devenv", + "cachix", + "pre-commit-hooks" + ] + }, + "locked": { + "lastModified": 1708704632, + "narHash": "sha256-w+dOIW60FKMaHI1q5714CSibk99JfYxm0CzTinYWr+Q=", + "owner": "cachix", + "repo": "devenv", + "rev": "2ee4450b0f4b95a1b90f2eb5ffea98b90e48c196", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "python-rewrite", + "repo": "devenv", + "type": "github" + } + }, "fenix": { "inputs": { - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs_3", "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1704867811, - "narHash": "sha256-pG4O1vPpNSMjz7p/5x+/OH4tXC0thzAPbJ55kI/W5dU=", + "lastModified": 1712384501, + "narHash": "sha256-AZmYmEnc1ZkSlxUJVUtGh9VFAqWPr+xtNIiBqD2eKfc=", "owner": "nix-community", "repo": "fenix", - "rev": "93e89638c15512db65e931f26ce36edf8cfbb4a5", + "rev": "99c6241db5ca5363c05c8f4acbdf3a4e8fc42844", "type": "github" }, "original": { @@ -56,16 +112,116 @@ "type": "github" } }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" }, "locked": { - "lastModified": 1685518550, - "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", "owner": "numtide", "repo": "flake-utils", - "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1701680307, + "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "inputs": { + "systems": "systems_3" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -78,16 +234,17 @@ "inputs": { "nixpkgs": [ "devenv", + "cachix", "pre-commit-hooks", "nixpkgs" ] }, "locked": { - "lastModified": 1660459072, - "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "lastModified": 1703887061, + "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", "type": "github" }, "original": { @@ -96,53 +253,109 @@ "type": "github" } }, - "lowdown-src": { - "flake": false, + "gitignore_2": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1633514407, - "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", - "owner": "kristapsdz", - "repo": "lowdown", - "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", "type": "github" }, "original": { - "owner": "kristapsdz", - "repo": "lowdown", + "owner": "hercules-ci", + "repo": "gitignore.nix", "type": "github" } }, "nix": { "inputs": { - "lowdown-src": "lowdown-src", + "flake-compat": "flake-compat", "nixpkgs": [ + "devenv", + "cachix", "devenv", "nixpkgs" ], "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1676545802, - "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "lastModified": 1708577783, + "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", "owner": "domenkozar", "repo": "nix", - "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", "type": "github" }, "original": { "owner": "domenkozar", - "ref": "relaxed-flakes", + "ref": "devenv-2.21", + "repo": "nix", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688870561, + "narHash": "sha256-4UYkifnPEw1nAzqqPOTL2MvWtm3sNGw1UTYTalkTcGY=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "165b1650b753316aa7f1787f3005a8d2da0f5301", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nix_2": { + "inputs": { + "flake-compat": "flake-compat_5", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression_2" + }, + "locked": { + "lastModified": 1710500156, + "narHash": "sha256-zvCqeUO2GLOm7jnU23G4EzTZR7eylcJN+HJ5svjmubI=", + "owner": "domenkozar", + "repo": "nix", + "rev": "c5bbf14ecbd692eeabf4184cc8d50f79c2446549", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.21", "repo": "nix", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1678875422, - "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "lastModified": 1692808169, + "narHash": "sha256-x9Opq06rIiwdwGeK2Ykj69dNc2IvUH1fY55Wm7atwrE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "rev": "9201b5ff357e781bf014d0330d18555695df7ba8", "type": "github" }, "original": { @@ -168,45 +381,93 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-regression_2": { "locked": { - "lastModified": 1685801374, - "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.05", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1704874635, + "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_2": { + "locked": { + "lastModified": 1710695816, + "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1704538339, - "narHash": "sha256-1734d3mQuux9ySvwf6axRWZRBhtcZA9Q8eftD6EZg6U=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "46ae0210ce163b3cba6c7da08840c1d63de9c701", + "lastModified": 1710236354, + "narHash": "sha256-vWrciFdq49vve43g4pbi7NjmL4cwG1ifXnQx+dU3T5E=", + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "829e73affeadfb4198a7105cbe3a03153d13edc9", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", "type": "github" } }, "nixpkgs_3": { "locked": { - "lastModified": 1704722960, - "narHash": "sha256-mKGJ3sPsT6//s+Knglai5YflJUF2DGj7Ai6Ynopz0kI=", + "lastModified": 1712163089, + "narHash": "sha256-Um+8kTIrC19vD4/lUCN9/cU9kcOsD1O1m+axJqQPyMM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "fd281bd6b7d3e32ddfa399853946f782553163b5", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1712439257, + "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "317484b1ead87b9c1b8ac5261a8d2dd748a0492d", + "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", "type": "github" }, "original": { @@ -216,26 +477,77 @@ "type": "github" } }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1692876271, + "narHash": "sha256-IXfZEkI0Mal5y1jr6IRWMqK8GW2/f28xJenZIPQqkY0=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "d5006be9c2c2417dafb2e2e5034d83fabd207ee3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, "pre-commit-hooks": { "inputs": { - "flake-compat": [ - "devenv", - "flake-compat" - ], - "flake-utils": "flake-utils", + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_2", "gitignore": "gitignore", "nixpkgs": [ "devenv", + "cachix", "nixpkgs" ], "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1704725188, - "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", + "lastModified": 1708018599, + "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "ea96f0c05924341c551a797aaba8126334c505d2", + "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pre-commit-hooks_2": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils_3", + "gitignore": "gitignore_2", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable_2" + }, + "locked": { + "lastModified": 1712055707, + "narHash": "sha256-4XLvuSIDZJGS17xEwSrNuJLL7UjDYKGJSbK1WWX2AK8=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "e35aed5fda3cc79f88ed7f1795021e559582093a", "type": "github" }, "original": { @@ -248,18 +560,18 @@ "inputs": { "devenv": "devenv", "fenix": "fenix", - "nixpkgs": "nixpkgs_3", - "systems": "systems_2" + "nixpkgs": "nixpkgs_4", + "systems": "systems_4" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1704833483, - "narHash": "sha256-Ox01mpYmjapNYaqOu4fMS/4Ma9NLd2rVNz6d4rJmcf4=", + "lastModified": 1712156296, + "narHash": "sha256-St7ZQrkrr5lmQX9wC1ZJAFxL8W7alswnyZk9d1se3Us=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "ae6e73772432cfe35bb0ff6de6fdcfa908642b67", + "rev": "8e581ac348e223488622f4d3003cb2bd412bf27e", "type": "github" }, "original": { @@ -298,6 +610,36 @@ "repo": "default", "type": "github" } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", From 9da157ff4a3b843a2ed107bac074f0d61cfdfa97 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 11 Apr 2024 03:23:03 +0200 Subject: [PATCH 111/189] lang: massive amounts of parser and ast pain --- Cargo.lock | 52 ++- crates/lang/Cargo.toml | 4 +- crates/lang/src/main.rs | 37 +- crates/lang/src/parser.rs | 117 +++-- crates/lang/src/parser/ast.rs | 47 +- crates/lang/src/parser/ast/ast_tree.rs | 31 ++ crates/lang/src/parser/ast/lossless.rs | 19 + crates/lang/src/parser/ast/lossless/lex.rs | 118 +++++ crates/lang/src/parser/ast/lossless/parser.rs | 437 ++++++++++++++++++ crates/lang/src/parser/ast/raw_ast.rs | 50 ++ crates/lang/src/parser/tests.rs | 2 +- crates/lang/src/tokens.rs | 15 +- crates/lang/src/tokens/tests.rs | 14 +- flake.lock | 30 +- flake.nix | 86 ++-- testfiles/test.owo | 11 +- 16 files changed, 900 insertions(+), 170 deletions(-) create mode 100644 crates/lang/src/parser/ast/ast_tree.rs create mode 100644 crates/lang/src/parser/ast/lossless.rs create mode 100644 crates/lang/src/parser/ast/lossless/lex.rs create mode 100644 crates/lang/src/parser/ast/lossless/parser.rs create mode 100644 crates/lang/src/parser/ast/raw_ast.rs diff --git a/Cargo.lock b/Cargo.lock index e762ead..a25751d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,9 +174,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chumsky" -version = "1.0.0-alpha.6" +version = "1.0.0-alpha.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c28d4e5dd9a9262a38b231153591da6ce1471b818233f4727985d3dd0ed93c" +checksum = "c7b80276986f86789dc56ca6542d53bba9cda3c66091ebbe7bd96fc1bdf20f1f" dependencies = [ "hashbrown", "regex-automata", @@ -237,6 +237,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "countme" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" + [[package]] name = "crc32fast" version = "1.3.2" @@ -322,6 +328,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ego-tree" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" + [[package]] name = "either" version = "1.9.0" @@ -506,9 +518,11 @@ dependencies = [ "ariadne", "chumsky", "clap", + "ego-tree", "indexmap", "logos", "petgraph", + "rowan", ] [[package]] @@ -589,6 +603,15 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -863,6 +886,25 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rowan" +version = "0.15.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a58fa8a7ccff2aec4f39cc45bf5f985cec7125ab271cf681c279fd00192b49" +dependencies = [ + "countme", + "hashbrown", + "memoffset", + "rustc-hash", + "text-size", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "ryu" version = "1.0.16" @@ -973,6 +1015,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "text-size" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" + [[package]] name = "thiserror" version = "1.0.55" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 1cd8654..8c1d3db 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -7,11 +7,13 @@ edition = "2021" [dependencies] logos = "0.14" -chumsky = {version= "1.0.0-alpha.6", features=["label"]} +chumsky = {version= "1.0.0-alpha.7", features=["label"]} petgraph = { workspace = true} indexmap = "2.2.6" clap = { version = "4", features = ["derive"] } ariadne = "0.4.0" +ego-tree = "0.6.2" +rowan = "0.15.15" [lints] workspace = true diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 3e70973..16ec4e4 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,7 +1,10 @@ use std::{fs, path::PathBuf}; use clap::Parser; -use lang::{err_reporting::ErrorCollector, parser::parse}; +use lang::{ + err_reporting::ErrorCollector, + parser::ast::lossless::{lex, parser}, +}; #[derive(Parser)] struct Args { @@ -13,20 +16,24 @@ fn main() { let args = Args::parse(); let n = args.file.clone(); let f = fs::read_to_string(n.clone()).expect("failed to read file"); - let mut err_collector = ErrorCollector::new(vec![(n.to_str().unwrap(), &f)]); + println!("toks: {:?}", lex::lex(&f)); + let parse_res = parser::parse(&f); + println!("parse: {:?}", parse_res); + // dbg!(lex::lex(&f)); + // let mut err_collector = ErrorCollector::new(vec![(n.to_str().unwrap(), &f)]); - println!("file: {f}\n"); - let parse_res = parse(&f); - err_collector.insert_many( - args.file.to_str().unwrap(), - lang::err_reporting::Stage::Parse, - parse_res - .errors() - .into_iter() - .map(|e| e.to_owned()) - .collect::>(), - ); + // println!("file: {f}\n"); + // let parse_res = parse(&f); + // err_collector.insert_many( + // args.file.to_str().unwrap(), + // lang::err_reporting::Stage::Parse, + // parse_res + // .errors() + // .into_iter() + // .map(|e| e.to_owned()) + // .collect::>(), + // ); - err_collector.report_raw(); - println!("res: {:?}", parse_res); + // err_collector.report_raw(); + // println!("res: {:?}", parse_res); } diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 7c0e406..b1ee34b 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -1,5 +1,3 @@ -use std::ops::Range; - use chumsky::{ error::Rich, input::{Stream, ValueInput}, @@ -10,19 +8,22 @@ use chumsky::{ IterParser, }; use indexmap::IndexMap; -use logos::{Logos, Source}; +use logos::Logos; use crate::tokens::Token; pub mod ast; #[cfg(test)] mod tests; -use self::ast::{Expr, Expression, File}; +use self::ast::{ + raw_ast::{RawExpr, RawExpression}, + File, +}; pub type Span = SimpleSpan; pub type Spanned = (T, Span); -pub fn parse<'src>(src: &'src str) -> ParseResult, Rich<'_, Token<'_>>> { +pub fn parse(src: &str) -> ParseResult, Rich<'_, Token<'_>>> { let toks: Vec<_> = Token::lexer(src) .spanned() .map(|(t, s)| (t.expect("TODO: add lexer error(s)"), Span::from(s))) @@ -35,22 +36,39 @@ pub(crate) fn parser< 'src: 'tokens, I: ValueInput<'tokens, Token = Token<'src>, Span = Span>, >() -> impl Parser<'tokens, I, File<'src>, extra::Err, Span>>> { - let word = select! { Token::Word(word) => word }; + let word = select! { Token::Word(word) = e => (word, e.span())}; let expr = recursive(|expr| { let lit = select! { - Token::Int(i) = e => Expression::new(Expr::Lit(ast::Lit::Int(i.parse().unwrap())), e.span()), - Token::Float(f) = e => Expression::new(Expr::Lit(ast::Lit::Float(f.parse().unwrap())), e.span()), + Token::Int(i) = e => RawExpression::new(RawExpr::Lit(ast::Lit::Int(i.parse().expect("TODO: handle better"))), e.span()), + Token::Float(f) = e => RawExpression::new(RawExpr::Lit(ast::Lit::Float(f.parse().expect("TODO: handle better"))), e.span()), + Token::String(s) = e => RawExpression::new(RawExpr::Lit(ast::Lit::String(s.strip_prefix('"').expect("a").strip_suffix('"').expect("b"))), e.span()) }; + let mat = just(Token::Mat) + .ignore_then(select! { Token::Dimensions(dimensions) = e => (dimensions, e.span())}) + .then( + lit.separated_by(just(Token::Comma)) + .collect::>() + .separated_by(just(Token::Semicolon)) + .collect::>() + .delimited_by(just(Token::BracketOpen), just(Token::BracketClose)), + ) + .map_with(|(dimensions, data), e| { + // TODO: Validation and proper error handling/reporting + // (validation = validating the matrix dimensions) + RawExpression::new( + RawExpr::Matrix(dimensions, data.into_iter().flatten().collect()), + e.span(), + ) + }); let var = select! { - Token::VarIdent(name) => (Expr::Var as fn(_) -> _, name), - Token::InputIdent(name) => (Expr::InputVar as fn(_) -> _, name) + Token::VarIdent(name) => (RawExpr::Var as fn(_) -> _, name), + Token::InputIdent(name) => (RawExpr::InputVar as fn(_) -> _, name) } - .map_with(|(item_type, name), extra| Expression::new(item_type(name), extra.span())) + .map_with(|(item_type, name), extra| RawExpression::new(item_type(name), extra.span())) .labelled("variable"); let attrset = word - .map_with(|n, e| (n, e.span())) .labelled("attr name") .then_ignore(just(Token::Colon)) .then(expr) @@ -63,57 +81,72 @@ pub(crate) fn parser< .labelled("attrset"); let node = word - .map_with(|v, e| (v, e.span())) + .repeated() + .collect() .then(attrset.clone().or_not()) .map_with(|(name, params), extra| { - Expression::new(Expr::Node(name, params), extra.span()) + RawExpression::new(RawExpr::Node(name, params), extra.span()) }) - .or(var) - .or(attrset - .map_with(|attrset, extra| Expression::new(Expr::AttrSet(attrset), extra.span()))) + // .or(var) + // .or(attrset + // .map_with(|attrset, extra| Expression::new(Expr::AttrSet(attrset), extra.span()))) + // .or(lit) + // .or(mat) .labelled("node"); + let atom = var + .or(lit) + .or(mat) + .or(attrset.map_with(|attrset, extra| { + RawExpression::new(RawExpr::AttrSet(attrset), extra.span()) + })) + .or(node.clone()); + #[allow(clippy::let_and_return)] - let pipeline = node + let pipeline = atom .clone() .then(choice(( - just(Token::Pipe).to(Expr::SimplePipe as fn(_, _) -> _), - just(Token::MappingPipe).to(Expr::MappingPipe as fn(_, _) -> _), - just(Token::NullPipe).to(Expr::NullPipe as fn(_, _) -> _), + just(Token::Pipe).to(RawExpr::SimplePipe as fn(_, _) -> _), + just(Token::MappingPipe).to(RawExpr::MappingPipe as fn(_, _) -> _), + just(Token::NullPipe).to(RawExpr::NullPipe as fn(_, _) -> _), ))) .repeated() - .foldr_with(node, |(curr, pipe), next, extra| { - Expression::new(pipe(Box::new(curr), Box::new(next)), extra.span()) + .foldr_with(atom, |(curr, pipe), next, extra| { + RawExpression::new(pipe(curr, next), extra.span()) }); pipeline }); - let decl = just(Token::Def).ignore_then( - word.map_with(|n, e| (n, e.span())) - .then_ignore(just(Token::Equals)) - .then(expr.clone().map(|expr| expr)) - .then_ignore(just(Token::SemiColon)), - ); + let decls = just(Token::Def) + .ignore_then( + word.then_ignore(just(Token::Equals)) + .then(expr.clone().map(|expr| expr)) + .then_ignore(just(Token::Semicolon)), + ) + .repeated() + .collect::>() + .map(|decls| File { + decls: IndexMap::from_iter(decls), + }); - expr.map(|expr| File { + let single_expr = expr.map(|expr| File { decls: IndexMap::from_iter([(("main", (0..0).into()), expr)]), - }) - .or(decl.repeated().collect::>().map(|decls| File { - decls: IndexMap::from_iter(decls), - })) + }); + + just(Token::Def).rewind().ignore_then(decls).or(single_expr) + // single_expr.or(decls) + + // expr.map(|expr| File { + // decls: IndexMap::from_iter([(("main", (0..0).into()), expr)]), + // }) + // .or(decl.repeated().collect::>().map(|decls| File { + // decls: IndexMap::from_iter(decls), + // })) } pub mod asg { use petgraph::graph::DiGraph; use super::Spanned; - - pub struct Asg<'src> { - graph: DiGraph, String>, - } - - enum AsgNode<'src> { - Node(Spanned<&'src str>), - } } diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs index d21ad49..d45ef66 100644 --- a/crates/lang/src/parser/ast.rs +++ b/crates/lang/src/parser/ast.rs @@ -2,51 +2,14 @@ use std::collections::{BTreeMap, HashMap}; use indexmap::IndexMap; -use super::{Span, Spanned}; +use super::Spanned; #[derive(Debug, PartialEq)] pub struct File<'src> { - pub decls: IndexMap, Expression<'src>>, + pub decls: IndexMap, raw_ast::RawExpression<'src>>, } -#[derive(Debug, PartialEq)] -pub struct Expression<'src> { - pub expr: Expr<'src>, - pub span: Span, -} - -impl<'src> Expression<'src> { - pub fn new(expr: Expr<'src>, span: Span) -> Self { - Self { expr, span } - } -} - -#[derive(Debug, PartialEq)] -pub enum Expr<'src> { - Node( - Spanned<&'src str>, - Option, Expression<'src>>>>, - ), - SimplePipe(Box>, Box>), - // NamingPipe( - // Box>, - // (Vec>, Vec>), - // Box>, - // ), - MappingPipe(Box>, Box>), - NullPipe(Box>, Box>), - MultiPipe(IndexMap, Expression<'src>>), - // LetIn( - // IndexMap, Box>>, - // Box>, - // ), - // $ - Var(&'src str), - // @ - InputVar(&'src str), - AttrSet(Spanned, Expression<'src>>>), - Lit(Lit<'src>), -} +pub mod raw_ast; #[derive(Debug, PartialEq)] pub enum Lit<'src> { @@ -55,3 +18,7 @@ pub enum Lit<'src> { Float(f64), String(&'src str), } + +pub mod lossless; + +pub mod ast_tree; diff --git a/crates/lang/src/parser/ast/ast_tree.rs b/crates/lang/src/parser/ast/ast_tree.rs new file mode 100644 index 0000000..46db4e9 --- /dev/null +++ b/crates/lang/src/parser/ast/ast_tree.rs @@ -0,0 +1,31 @@ +use ego_tree::Tree; + +use crate::parser::Spanned; + +use super::{File, Lit}; + +pub struct Ast<'src> { + tree: Tree>, +} + +struct AstNode<'src> { + kind: NodeKind<'src>, +} + +enum NodeKind<'src> { + Decl, + Ident(&'src str), + Instr, + Expr, + MappingPipe, + NullPipe, + MultiPipe, + Var(&'src str), + InputVar(&'src str), + AttrSet, + Attr, + Lit(Lit<'src>), + Matrix, + Dimensions(u16, u16), + MatrixRow, +} diff --git a/crates/lang/src/parser/ast/lossless.rs b/crates/lang/src/parser/ast/lossless.rs new file mode 100644 index 0000000..0047441 --- /dev/null +++ b/crates/lang/src/parser/ast/lossless.rs @@ -0,0 +1,19 @@ +use self::lex::SyntaxKind; + +pub mod parser; + +pub mod lex; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +enum Lang {} +impl rowan::Language for Lang { + type Kind = SyntaxKind; + #[allow(unsafe_code)] + fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind { + assert!(raw.0 <= SyntaxKind::ROOT as u16); + unsafe { std::mem::transmute::(raw.0) } + } + fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind { + kind.into() + } +} diff --git a/crates/lang/src/parser/ast/lossless/lex.rs b/crates/lang/src/parser/ast/lossless/lex.rs new file mode 100644 index 0000000..c25608a --- /dev/null +++ b/crates/lang/src/parser/ast/lossless/lex.rs @@ -0,0 +1,118 @@ +use logos::Logos; + +use crate::parser::Span; + +pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { + let mut lex = SyntaxKind::lexer(src); + let mut r = Vec::new(); + + while let Some(tok_res) = lex.next() { + r.push((tok_res.unwrap_or(SyntaxKind::LEX_ERR), lex.slice())) + } + + r.reverse(); + r +} + +#[derive(Logos, Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord)] +#[repr(u16)] +#[allow(non_camel_case_types)] +pub enum SyntaxKind { + #[token("def")] + DEF_KW = 0, + #[token("let")] + LET_KW, + #[token("in")] + IN_KW, + #[token("mat")] + MAT_KW, + #[regex("[\\d]+x[\\d]+")] + PAT_DIMENSIONS, + #[regex("[\\d]+")] + INT_NUM, + #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")] + FLOAT_NUM, + #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)] + STRING, + MATRIX, + DECL, + LIST, + MAT_BODY, + PARENTHESIZED_EXPR, + EXPR, + #[token("(")] + L_PAREN, + #[token(")")] + R_PAREN, + #[token("{")] + L_CURLY, + #[token("}")] + R_CURLY, + #[token("[")] + L_BRACK, + #[token("]")] + R_BRACK, + #[token("<")] + L_ANGLE, + #[token(">")] + R_ANGLE, + #[token("+")] + PLUS, + #[token("-")] + MINUS, + #[token("*")] + STAR, + #[token("/")] + SLASH, + #[token("%")] + PERCENT, + #[token("^")] + CARET, + INSTR, + INSTR_NAME, + INSTR_PARAMS, + ATTR_SET, + ATTR, + ATTR_NAME, + ATTR_VALUE, + #[regex("[a-zA-Z_]+[a-zA-Z_\\-\\d]*")] + IDENT, + #[regex("\\$[a-zA-Z0-9_\\-]+")] + VAR, + #[regex("\\@[a-zA-Z0-9_\\-]+")] + INPUT_VAR, + #[token("$")] + DOLLAR, + #[token("@")] + AT, + #[token(",")] + COMMA, + #[token("|")] + PIPE, + #[token("@|")] + MAPPING_PIPE, + #[token("!|")] + NULL_PIPE, + #[token("=")] + EQ, + #[token(":")] + COLON, + #[token(";")] + SEMICOLON, + #[token(".")] + DOT, + #[token("!")] + BANG, + #[regex("[ \\t\\f]+")] + WHITESPACE, + #[token("\n")] + NEWLINE, + PARSE_ERR, + LEX_ERR, + ROOT, +} +impl From for rowan::SyntaxKind { + fn from(kind: SyntaxKind) -> Self { + Self(kind as u16) + } +} diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs new file mode 100644 index 0000000..a3c30ca --- /dev/null +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -0,0 +1,437 @@ +use std::borrow::Borrow; + +use chumsky::container::Container; +use rowan::{ + Checkpoint, GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken, +}; + +use crate::parser::{ + ast::lossless::{lex::SyntaxKind::*, Lang}, + Span, +}; + +use super::lex::{self, SyntaxKind}; + +#[derive(PartialEq, Eq)] +pub struct Parse { + pub green_node: GreenNode, +} + +impl std::fmt::Debug for Parse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + debug_print_green_node(NodeOrToken::Node(self.green_node.borrow()), f, 0) + } +} + +fn debug_print_green_node( + node: NodeOrToken<&GreenNodeData, &GreenTokenData>, + f: &mut std::fmt::Formatter<'_>, + lvl: i32, +) -> std::fmt::Result { + for _ in 0..lvl { + f.write_str(" ")?; + } + + match node { + NodeOrToken::Node(n) => { + writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind())); + for c in n.children() { + debug_print_green_node(c, f, lvl + 1)?; + } + for _ in 0..lvl { + f.write_str(" ")?; + } + f.write_str("}\n") + } + NodeOrToken::Token(t) => { + writeln!(f, "{:?} {:?};", Lang::kind_from_raw(t.kind()), t.text()) + } + } +} + +#[derive(Debug)] +struct Parser<'src> { + tokens: Vec<(SyntaxKind, &'src str)>, + builder: GreenNodeBuilder<'src>, + errors: Vec, +} + +#[derive(Debug, PartialEq, Eq)] +enum SyntaxError { + Expected(SyntaxKind), + AttrExpectedValue, + /// guessed if there's a newline and attr on next line without comma + /// should then suggest comma after attr + ExpectedCommaBetweenAttrs, +} + +pub fn parse(src: &str) -> Parse { + let mut tokens = lex::lex(src); + Parser { + tokens, + builder: GreenNodeBuilder::new(), + errors: Vec::new(), + } + .parse() +} + +impl Parser<'_> { + fn parse(mut self) -> Parse { + self.start_node(ROOT); + + match self.expr(None) { + expr::ExprRes::Ok => (), + expr::ExprRes::Eof => (), + expr::ExprRes::NoExpr => todo!(), + } + + self.builder.finish_node(); + Parse { + green_node: self.builder.finish(), + } + } + + fn start_node(&mut self, kind: SyntaxKind) { + self.builder.start_node(kind.into()); + } + fn finish_node(&mut self) { + self.builder.finish_node(); + } + + /// Advance one token, adding it to the current branch of the tree builder. + fn bump(&mut self) { + let (kind, text) = self.tokens.pop().unwrap(); + self.builder.token(kind.into(), text); + } + fn syntax_err(&mut self, err: SyntaxError) { + let (_, text) = self.tokens.pop().unwrap(); + self.builder.token(PARSE_ERR.into(), text); + self.errors.push(err); + } + fn syntax_err_by_checkpoint(&mut self, checkpoint: Checkpoint, err: SyntaxError) { + self.builder.start_node_at(checkpoint, PARSE_ERR.into()); + self.finish_node(); + self.errors.push(err); + } + fn expected(&mut self, expected: SyntaxKind) { + self.syntax_err(SyntaxError::Expected(expected)) + } + /// Peek at the first unprocessed token + fn current(&self) -> Option { + self.tokens.last().map(|(kind, _)| *kind) + } + fn next(&self) -> Option { + self.tokens + .get(self.tokens.len() - 2) + .map(|(kind, _)| *kind) + } + fn skip_ws(&mut self) { + while self.current() == Some(WHITESPACE) || self.current() == Some(NEWLINE) { + self.bump() + } + } + fn skip_ws_without_newlines(&mut self) { + while self.current() == Some(WHITESPACE) { + self.bump() + } + } +} + +mod expr { + use rowan::Checkpoint; + + use super::{attrset::AttrsetRes, instr::NodeRes, Parser}; + use crate::parser::{ast::lossless::lex::SyntaxKind::*, Span}; + impl Parser<'_> { + pub(super) fn expr(&mut self, start: Option) -> ExprRes { + self.skip_ws(); + let start = start.unwrap_or_else(|| self.builder.checkpoint()); + match self.current() { + Some(IDENT) => { + let expr_res = match self.instr() { + NodeRes::Ok => ExprRes::Ok, + NodeRes::Eof => ExprRes::Eof, + }; + self.builder.start_node_at(start, EXPR.into()); + self.finish_node(); + expr_res + } + Some(_) => self.atom(Some(start)), + None => ExprRes::Eof, + } + } + + pub(super) fn atom(&mut self, start: Option) -> ExprRes { + self.skip_ws(); + let start = start.unwrap_or_else(|| self.builder.checkpoint()); + match self.current() { + Some(INT_NUM | FLOAT_NUM | STRING) => { + self.bump(); + self.builder.start_node_at(start, EXPR.into()); + self.finish_node(); + ExprRes::Ok + } + Some(L_CURLY) => match self.attrset(start) { + AttrsetRes::Ok => ExprRes::Ok, + AttrsetRes::Eof => ExprRes::Eof, + }, + Some(L_PAREN) => { + self.builder.start_node_at(start, PARENTHESIZED_EXPR.into()); + self.bump(); + self.expr(None); + self.skip_ws(); + match self.current() { + Some(R_PAREN) => ExprRes::Ok, + Some(_) => todo!(), + None => ExprRes::Eof, + } + } + Some(_) => ExprRes::NoExpr, + None => ExprRes::Eof, + } + } + } + + pub enum ExprRes { + Ok, + Eof, + /// isnt an expression + NoExpr, + } +} + +mod attrset { + use chumsky::container::Container; + use rowan::Checkpoint; + + use super::{expr::ExprRes, instr::NodeRes, Parser}; + use crate::parser::{ + ast::lossless::{lex::SyntaxKind::*, parser::SyntaxError}, + Span, + }; + impl Parser<'_> { + pub(super) fn attrset(&mut self, checkpoint: Checkpoint) -> AttrsetRes { + assert_eq!(self.current(), Some(L_CURLY)); + self.bump(); + self.skip_ws(); + match self.current() { + Some(R_CURLY) => { + self.builder.start_node_at(checkpoint, ATTR_SET.into()); + self.bump(); + self.finish_node(); + AttrsetRes::Ok + } + Some(_) => { + self.builder.start_node_at(checkpoint, ATTR_SET.into()); + let res = match self.attrs() { + AttrRes::Eof => AttrsetRes::Eof, + AttrRes::RCurly | AttrRes::Ok => { + println!("curr: {:?}", self.current()); + AttrsetRes::Ok + } + }; + self.finish_node(); + res + } + None => AttrsetRes::Eof, + } + // self.start_node(ATTR); + } + + fn attrs(&mut self) -> AttrRes { + let mut res = AttrRes::Ok; + + while res == AttrRes::Ok { + println!("it: {:?}", self.tokens.last()); + match self.attr() { + AttrRes::Ok => { + self.skip_ws_without_newlines(); + println!( + "a: {:?}, {:?}", + self.tokens.last(), + self.tokens.get(self.tokens.len() - 2) + ); + println!("errs: {:?}", self.errors); + res = AttrRes::Ok; + let checkpoint_previous_end = self.builder.checkpoint(); + res = match self.current() { + Some(COMMA) => { + self.bump(); + AttrRes::Ok + } + Some(R_CURLY) => { + self.bump(); + res = AttrRes::Ok; + break; + } + Some(NEWLINE) => { + self.skip_ws(); + println!( + "b: {:?}, {:?}", + self.tokens.last(), + self.tokens.get(self.tokens.len() - 2) + ); + match self.current() { + Some(COMMA) => { + self.bump(); + AttrRes::Ok + } + Some(R_CURLY) => { + self.bump(); + res = AttrRes::Ok; + break; + } + Some(IDENT) => { + println!("wtf"); + self.syntax_err_by_checkpoint( + checkpoint_previous_end, + SyntaxError::ExpectedCommaBetweenAttrs, + ); + // self.syntax_err(SyntaxError::ExpectedCommaBetweenAttrs); + AttrRes::Ok + } + Some(_) => { + self.bump(); + AttrRes::Ok + } + None => { + res = AttrRes::Eof; + break; + } + } + } + Some(_) => { + self.bump(); + println!( + "c: {:?}, {:?}", + self.tokens.last(), + self.tokens.get(self.tokens.len() - 2) + ); + AttrRes::Ok + } + None => { + res = AttrRes::Eof; + break; + } + } + } + AttrRes::Eof => { + res = AttrRes::Eof; + break; + } + AttrRes::RCurly => { + res = AttrRes::RCurly; + break; + } + } + } + println!("toks_left: {:?}", self.tokens); + res + } + + fn attr(&mut self) -> AttrRes { + self.skip_ws(); + self.start_node(ATTR); + self.start_node(ATTR_NAME); + match self.current() { + Some(IDENT) => self.bump(), + Some(R_CURLY) => return AttrRes::Ok, + Some(_) => self.expected(IDENT), + None => return AttrRes::Eof, + } + self.finish_node(); + self.skip_ws(); + match self.current() { + Some(COLON) => self.bump(), + Some(R_CURLY) => { + self.expected(COLON); + return AttrRes::RCurly; + } + Some(_) => self.expected(COLON), + None => return AttrRes::Eof, + } + self.skip_ws(); + self.start_node(ATTR_VALUE); + match self.expr(None) { + ExprRes::Ok => self.bump(), + ExprRes::Eof => return AttrRes::Eof, + ExprRes::NoExpr => match self.current() { + Some(COMMA) => self.syntax_err(SyntaxError::AttrExpectedValue), + Some(R_CURLY) => { + self.syntax_err(SyntaxError::AttrExpectedValue); + return AttrRes::RCurly; + } + Some(_) => self.expected(EXPR), + None => unreachable!(), + }, + } + self.finish_node(); + self.finish_node(); + AttrRes::Ok + } + } + + #[derive(PartialEq, Eq)] + pub enum AttrsetRes { + Ok, + Eof, + } + + #[derive(PartialEq, Eq)] + enum AttrRes { + Ok, + Eof, + RCurly, + } +} + +mod instr { + use super::Parser; + use crate::parser::{ + ast::lossless::{lex::SyntaxKind::*, parser::expr::ExprRes}, + Span, + }; + + impl Parser<'_> { + pub(super) fn instr(&mut self) -> NodeRes { + assert_eq!(self.current(), Some(IDENT)); + self.skip_ws(); + self.start_node(INSTR); + self.instr_name(); + + // used to count positionals + let mut i = 0; + let params_checkpoint = self.builder.checkpoint(); + loop { + match self.expr(None) { + ExprRes::Ok => { + i += 1; + continue; + } + ExprRes::NoExpr | ExprRes::Eof => break, + } + } + if i >= 1 { + self.builder + .start_node_at(params_checkpoint, INSTR_PARAMS.into()); + self.finish_node(); + } + self.finish_node(); + NodeRes::Ok + } + + fn instr_name(&mut self) { + self.start_node(INSTR_NAME); + while self.current() == Some(IDENT) { + self.bump(); + self.skip_ws_without_newlines(); + } + self.finish_node(); + } + } + + pub(super) enum NodeRes { + Ok, + Eof, + } +} diff --git a/crates/lang/src/parser/ast/raw_ast.rs b/crates/lang/src/parser/ast/raw_ast.rs new file mode 100644 index 0000000..a0ec749 --- /dev/null +++ b/crates/lang/src/parser/ast/raw_ast.rs @@ -0,0 +1,50 @@ +use indexmap::IndexMap; + +use super::super::Spanned; + +use super::super::Span; +use super::Lit; + +#[derive(Debug, PartialEq)] +pub struct RawExpression<'src> { + pub expr: Box>, + pub span: Span, +} + +impl<'src> RawExpression<'src> { + pub fn new(expr: RawExpr<'src>, span: Span) -> Self { + Self { + expr: Box::new(expr), + span, + } + } +} + +#[derive(Debug, PartialEq)] +pub enum RawExpr<'src> { + Node( + Vec>, + Option, RawExpression<'src>>>>, + ), + SimplePipe(RawExpression<'src>, RawExpression<'src>), + // NamingPipe( + // Box>, + // (Vec>, Vec>), + // Box>, + // ), + MappingPipe(RawExpression<'src>, RawExpression<'src>), + NullPipe(RawExpression<'src>, RawExpression<'src>), + MultiPipe(IndexMap, RawExpression<'src>>), + // LetIn( + // IndexMap, Box>>, + // Box>, + // ), + // $ + Var(&'src str), + // @ + InputVar(&'src str), + AttrSet(Spanned, RawExpression<'src>>>), + Lit(Lit<'src>), + Matrix(Spanned<(u16, u16)>, Vec>), + List(Vec>), +} diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs index 2bd2779..5bd221f 100644 --- a/crates/lang/src/parser/tests.rs +++ b/crates/lang/src/parser/tests.rs @@ -1,4 +1,4 @@ -use crate::parser::ast::{Expr, File}; +use crate::parser::ast::File; use crate::parser::parse; use crate::tokens::Token; use chumsky::input::Stream; diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs index 6caa57c..3314916 100644 --- a/crates/lang/src/tokens.rs +++ b/crates/lang/src/tokens.rs @@ -14,6 +14,14 @@ pub enum Token<'a> { Let, #[token("in")] In, + #[token("mat")] + Mat, + #[regex("[\\d]+x[\\d]+", |lex| { + let (x, y) = lex.slice().split_once('x').expect("shouldn't fail to split"); + // TODO: handle overflows etc + (x.parse().expect("should only match valid u16s"), y.parse().expect("should only match valid u16s")) + })] + Dimensions((u16, u16)), #[regex("[\\d]+", |lex| lex.slice())] Int(&'a str), #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)", |lex| lex.slice())] @@ -30,12 +38,11 @@ pub enum Token<'a> { Mult, #[token("/")] Div, - #[regex("[a-zA-Z_]+[a-zA-Z0-9_\\-]*", |lex| lex.slice())] + // TODO: figure out how to allow numbers in words? + #[regex("[a-zA-Z_]+[a-zA-Z_\\-\\d]*", |lex| lex.slice().trim())] Word(&'a str), #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] VarIdent(&'a str), - #[token("@..")] - InputSpread, #[regex("\\@[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] InputIdent(&'a str), #[token(",")] @@ -55,7 +62,7 @@ pub enum Token<'a> { #[token(":")] Colon, #[token(";")] - SemiColon, + Semicolon, #[token("[")] BracketOpen, #[token("]")] diff --git a/crates/lang/src/tokens/tests.rs b/crates/lang/src/tokens/tests.rs index 2b0454f..3b35ace 100644 --- a/crates/lang/src/tokens/tests.rs +++ b/crates/lang/src/tokens/tests.rs @@ -34,7 +34,7 @@ lexer_test! { lexer_test! { test_lex_subgroup, - "subgroup(first, second) = a | b { in1: $first } | c { in1: $second }", + "subgroup(first, second) = a | b [ $first ] | c [ $second ]", [ Token::Word("subgroup"), Token::ParenOpen, @@ -46,18 +46,14 @@ lexer_test! { Token::Word("a"), Token::Pipe, Token::Word("b"), - Token::BraceOpen, - Token::Word("in1"), - Token::Colon, + Token::BracketOpen, Token::VarIdent("first"), - Token::BraceClose, + Token::BracketClose, Token::Pipe, Token::Word("c"), - Token::BraceOpen, - Token::Word("in1"), - Token::Colon, + Token::BracketOpen, Token::VarIdent("second"), - Token::BraceClose + Token::BracketClose ] } diff --git a/flake.lock b/flake.lock index 43f154e..7c3a06d 100644 --- a/flake.lock +++ b/flake.lock @@ -33,11 +33,11 @@ "pre-commit-hooks": "pre-commit-hooks_2" }, "locked": { - "lastModified": 1712579011, - "narHash": "sha256-trHgFNW8CW85c1OuAPBI+OGous53KkVhMemvcq7syDo=", + "lastModified": 1712724616, + "narHash": "sha256-qs9uEbrOpp6oXcDOp5cpilyU52t78ZpEPATtaHRVLIU=", "owner": "cachix", "repo": "devenv", - "rev": "a71323c618664a6b7a39bc183b0ce22ac8511cf9", + "rev": "d1a11d14dbe96a03c7f9068e4d3af05f283734e0", "type": "github" }, "original": { @@ -83,11 +83,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1712384501, - "narHash": "sha256-AZmYmEnc1ZkSlxUJVUtGh9VFAqWPr+xtNIiBqD2eKfc=", + "lastModified": 1712730246, + "narHash": "sha256-iB8bFj+07RHpmt+XuGGvYQk2Iwm12u6+DklGq/+Tg5s=", "owner": "nix-community", "repo": "fenix", - "rev": "99c6241db5ca5363c05c8f4acbdf3a4e8fc42844", + "rev": "d402ae4a5e5676722290470f61a5e8e3155b5487", "type": "github" }, "original": { @@ -447,11 +447,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1712163089, - "narHash": "sha256-Um+8kTIrC19vD4/lUCN9/cU9kcOsD1O1m+axJqQPyMM=", + "lastModified": 1712608508, + "narHash": "sha256-vMZ5603yU0wxgyQeHJryOI+O61yrX2AHwY6LOFyV1gM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "fd281bd6b7d3e32ddfa399853946f782553163b5", + "rev": "4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6", "type": "github" }, "original": { @@ -463,11 +463,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1712439257, - "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", + "lastModified": 1712608508, + "narHash": "sha256-vMZ5603yU0wxgyQeHJryOI+O61yrX2AHwY6LOFyV1gM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", + "rev": "4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6", "type": "github" }, "original": { @@ -567,11 +567,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1712156296, - "narHash": "sha256-St7ZQrkrr5lmQX9wC1ZJAFxL8W7alswnyZk9d1se3Us=", + "lastModified": 1712663608, + "narHash": "sha256-tN9ZL6kGppmHg84lxlpAlaN+kXWNctKK7Yitq/iXDEw=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "8e581ac348e223488622f4d3003cb2bd412bf27e", + "rev": "a5feb4f05f09adca661c869b1bf2324898cbaa43", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index da80ec2..9d43d6e 100644 --- a/flake.nix +++ b/flake.nix @@ -11,41 +11,59 @@ extra-substituters = "https://devenv.cachix.org"; }; - outputs = { self, nixpkgs, devenv, systems, ... } @ inputs: - let - forEachSystem = nixpkgs.lib.genAttrs (import systems); - in - { - devShells = forEachSystem - (system: - let - pkgs = nixpkgs.legacyPackages.${system}; - in - { - default = devenv.lib.mkShell { - inherit inputs pkgs; - modules = [ - ({pkgs, config, ...}: { - languages.rust = { - enable = true; - channel = "nightly"; - }; + outputs = { + self, + nixpkgs, + devenv, + systems, + ... + } @ inputs: let + forEachSystem = nixpkgs.lib.genAttrs (import systems); + in { + devShells = + forEachSystem + (system: let + pkgs = nixpkgs.legacyPackages.${system}; + in { + default = devenv.lib.mkShell { + inherit inputs pkgs; + modules = [ + ({ + pkgs, + config, + ... + }: { + languages.rust = { + enable = true; + channel = "nightly"; + components = [ + "rustc" + "cargo" + "clippy" + "rustfmt" + "rust-src" + ]; + }; - pre-commit.hooks = { - clippy.enable = true; - rustfmt.enable = true; - }; + pre-commit.hooks = { + clippy.enable = true; + rustfmt.enable = true; + }; - packages = with pkgs; [ - just nushell - ripgrep - typst typst-lsp - mold - cargo-nextest cargo-watch - ]; - }) + packages = with pkgs; [ + just + nushell + ripgrep + typst + typst-lsp + mold + cargo-nextest + cargo-watch + rust-analyzer ]; - }; - }); - }; + }) + ]; + }; + }); + }; } diff --git a/testfiles/test.owo b/testfiles/test.owo index 809a6e1..3662b45 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,7 +1,4 @@ -def blend1 = [ - open "test.png", - open "test2.png" - ] - | blend multiply 0.6 - -def blend2 = open "test.png" | blend multiply 0.6 [ open test2.png ] +meow mew meow 5 3.14 "uwu" { + meow: test 24 + another: hi "hello", +} "awa" From 2d59a7f560bf81d24c0fc418a614f858efb454b2 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Apr 2024 01:02:07 +0200 Subject: [PATCH 112/189] lang: start implementing parser combinators (i have no idea what i'm doing) also, the current test.owo crashes for some reason. this is a headache. manual/imperative parsers are a nightmare. --- crates/lang/src/parser/ast/lossless/parser.rs | 18 +++++++++++++++++- flake.nix | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs index a3c30ca..95bb7d7 100644 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -1,6 +1,5 @@ use std::borrow::Borrow; -use chumsky::container::Container; use rowan::{ Checkpoint, GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken, }; @@ -12,6 +11,23 @@ use crate::parser::{ use super::lex::{self, SyntaxKind}; +mod parsers { + use rowan::GreenNode; + + use crate::parser::ast::lossless::lex::SyntaxKind; + + use super::SyntaxError; + + struct ParseResult { + green_node: GreenNode, + errors: Vec, + } + + trait Parser { + fn parse<'src>(input: &[(SyntaxKind, &'src str)]) -> ParseResult; + } +} + #[derive(PartialEq, Eq)] pub struct Parse { pub green_node: GreenNode, diff --git a/flake.nix b/flake.nix index 9d43d6e..3c8d815 100644 --- a/flake.nix +++ b/flake.nix @@ -46,7 +46,7 @@ }; pre-commit.hooks = { - clippy.enable = true; + clippy.enable = false; rustfmt.enable = true; }; From f7b61f9e0ef1b2085d4c4ad7ada721d4cec36be3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Apr 2024 15:43:34 +0200 Subject: [PATCH 113/189] lang: start working on parser that parses to events --- crates/lang/src/main.rs | 12 ++++-- crates/lang/src/parser/ast/lossless/parser.rs | 37 ++++++++++++++----- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 16ec4e4..203e1eb 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -3,7 +3,10 @@ use std::{fs, path::PathBuf}; use clap::Parser; use lang::{ err_reporting::ErrorCollector, - parser::ast::lossless::{lex, parser}, + parser::ast::lossless::{ + lex, + parser::{self, parser_to_events::to_events}, + }, }; #[derive(Parser)] @@ -17,8 +20,11 @@ fn main() { let n = args.file.clone(); let f = fs::read_to_string(n.clone()).expect("failed to read file"); println!("toks: {:?}", lex::lex(&f)); - let parse_res = parser::parse(&f); - println!("parse: {:?}", parse_res); + println!("evs: {:?}", to_events(&f)); + + // let parse_res = parser::parse(&f); + // println!("parse: {:?}", parse_res); + // dbg!(lex::lex(&f)); // let mut err_collector = ErrorCollector::new(vec![(n.to_str().unwrap(), &f)]); diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs index 95bb7d7..b5f5e85 100644 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -11,20 +11,37 @@ use crate::parser::{ use super::lex::{self, SyntaxKind}; -mod parsers { - use rowan::GreenNode; +pub mod parser_to_events { + use chumsky::Parser; - use crate::parser::ast::lossless::lex::SyntaxKind; + use crate::parser::ast::lossless::lex::SyntaxKind::{self, *}; - use super::SyntaxError; - - struct ParseResult { - green_node: GreenNode, - errors: Vec, + #[derive(Debug, PartialEq, Eq)] + pub(super) enum Event { + StartNode, + StartErr(SyntaxError), + EatToken, + FinishNode, + FinishErr, } - trait Parser { - fn parse<'src>(input: &[(SyntaxKind, &'src str)]) -> ParseResult; + #[derive(Debug, PartialEq, Eq)] + enum SyntaxError { + Expected(SyntaxKind), + AttrExpectedValue, + /// guessed if there's a newline and attr on next line without comma + /// should then suggest comma after attr + ExpectedCommaBetweenAttrs, + } + + pub fn to_events(src: &str) -> Vec { + let mut tokens = lex::lex(src); + parser().parse(tokens) + } + + pub fn parser() -> impl Parser<'static, SyntaxKind, Vec> { + let whitespace = just(WHITESPACE).or(NEWLINE).repeated().collect::>(); + whitespace } } From 1711d17fa6f89e6b9adc4884f0d35b9955b02acd Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Apr 2024 20:55:55 +0200 Subject: [PATCH 114/189] lang: parsing to events now --- crates/lang/Cargo.toml | 2 +- crates/lang/src/lib.rs | 1 + crates/lang/src/main.rs | 4 +- crates/lang/src/parser/ast/lossless/lex.rs | 1 - crates/lang/src/parser/ast/lossless/parser.rs | 461 +++++------------- flake.lock | 54 +- flake.nix | 31 +- testfiles/test.owo | 5 +- 8 files changed, 176 insertions(+), 383 deletions(-) diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 8c1d3db..3e03209 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] logos = "0.14" -chumsky = {version= "1.0.0-alpha.7", features=["label"]} +chumsky = {version= "1.0.0-alpha.7", features=["label", "extension"]} petgraph = { workspace = true} indexmap = "2.2.6" clap = { version = "4", features = ["derive"] } diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index 94a1430..ebf22d3 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,3 +1,4 @@ +#![feature(type_alias_impl_trait)] pub mod err_reporting; pub mod parser; pub mod tokens; diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 203e1eb..346862e 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -5,7 +5,7 @@ use lang::{ err_reporting::ErrorCollector, parser::ast::lossless::{ lex, - parser::{self, parser_to_events::to_events}, + parser::{self, parse}, }, }; @@ -20,7 +20,7 @@ fn main() { let n = args.file.clone(); let f = fs::read_to_string(n.clone()).expect("failed to read file"); println!("toks: {:?}", lex::lex(&f)); - println!("evs: {:?}", to_events(&f)); + println!("parse res: {:?}", parse(&f)); // let parse_res = parser::parse(&f); // println!("parse: {:?}", parse_res); diff --git a/crates/lang/src/parser/ast/lossless/lex.rs b/crates/lang/src/parser/ast/lossless/lex.rs index c25608a..e2a867b 100644 --- a/crates/lang/src/parser/ast/lossless/lex.rs +++ b/crates/lang/src/parser/ast/lossless/lex.rs @@ -10,7 +10,6 @@ pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { r.push((tok_res.unwrap_or(SyntaxKind::LEX_ERR), lex.slice())) } - r.reverse(); r } diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs index b5f5e85..adcb08e 100644 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -9,24 +9,29 @@ use crate::parser::{ Span, }; +use self::parser_to_events::{to_events, Event}; + use super::lex::{self, SyntaxKind}; pub mod parser_to_events { - use chumsky::Parser; + use chumsky::prelude::*; - use crate::parser::ast::lossless::lex::SyntaxKind::{self, *}; + use crate::parser::ast::lossless::lex::{ + self, + SyntaxKind::{self, *}, + }; - #[derive(Debug, PartialEq, Eq)] - pub(super) enum Event { - StartNode, + #[derive(Debug, PartialEq, Eq, Clone, Copy)] + pub enum Event { + StartNode(SyntaxKind), StartErr(SyntaxError), EatToken, FinishNode, FinishErr, } - #[derive(Debug, PartialEq, Eq)] - enum SyntaxError { + #[derive(Debug, PartialEq, Eq, Clone, Copy)] + pub enum SyntaxError { Expected(SyntaxKind), AttrExpectedValue, /// guessed if there's a newline and attr on next line without comma @@ -34,14 +39,107 @@ pub mod parser_to_events { ExpectedCommaBetweenAttrs, } - pub fn to_events(src: &str) -> Vec { - let mut tokens = lex::lex(src); - parser().parse(tokens) + pub fn to_events(tokens: &[(SyntaxKind, &str)]) -> Vec { + let mut only_toks: Vec = tokens.iter().map(|(t, _)| *t).collect(); + let res = parser().parse(&only_toks); + res.unwrap() } - pub fn parser() -> impl Parser<'static, SyntaxKind, Vec> { - let whitespace = just(WHITESPACE).or(NEWLINE).repeated().collect::>(); - whitespace + macro_rules! padded { + ($parser:expr) => {{ + let ws = one_of([WHITESPACE, NEWLINE]) + .to(Event::EatToken) + .repeated() + .collect::>(); + ws.then($parser) + .then(ws) + .map(|((mut before, mut c), mut after)| { + before.append(&mut c); + before.append(&mut after); + before + }) + }}; + } + + pub fn parser<'toks>() -> impl Parser<'toks, &'toks [SyntaxKind], Vec> { + let ws = one_of([WHITESPACE, NEWLINE]) + .to(Event::EatToken) + .repeated() + .collect::>(); + // let ws_without_newlines = just(WHITESPACE) + // .to(Event::EatToken) + // .repeated() + // .collect::>(); + let parenthesized = |c| { + just(L_PAREN) + .to(vec![Event::EatToken]) + .then(c) + .then(just(R_PAREN).to(vec![Event::EatToken])) + .map(|((mut before, mut c), mut after)| { + before.append(&mut c); + before.append(&mut after); + before + }) + }; + + let expr = recursive(|expr| { + let lit = one_of([INT_NUM, FLOAT_NUM, STRING]).to(vec![ + Event::StartNode(EXPR), + Event::EatToken, + Event::FinishNode, + ]); + + let atom = lit.clone().or(parenthesized(expr)); + + let ident = just(IDENT).to(vec![Event::EatToken]); + let instr_name = ident + .clone() + .map(|mut v| { + v.insert(0, Event::StartNode(INSTR_NAME)); + v + }) + .foldl( + ws.then(ident).repeated(), + |mut ident, (mut ws, mut next)| { + ident.append(&mut ws); + ident.append(&mut next); + ident + }, + ) + .map(|mut v| { + v.push(Event::FinishNode); + v + }); + let instr = padded!(instr_name) + .then( + atom.clone() + .map(|mut v| { + v.insert(0, Event::StartNode(INSTR_PARAMS)); + v + }) + .foldl( + ws.then(atom.clone()).repeated(), + |mut cur, (mut ws, mut next)| { + cur.append(&mut ws); + cur.append(&mut next); + cur + }, + ) + .map(|mut v| { + v.push(Event::FinishNode); + v + }), + ) + .map(|(mut name, mut params)| { + name.insert(0, Event::StartNode(INSTR)); + name.append(&mut params); + name.push(Event::FinishNode); + name + }); + padded!(instr.or(lit).or(atom)) + }); + expr + // .map(|(lit, mut ev)| lit.append(&mut ev)); } } @@ -99,7 +197,7 @@ enum SyntaxError { } pub fn parse(src: &str) -> Parse { - let mut tokens = lex::lex(src); + let tokens = lex::lex(src); Parser { tokens, builder: GreenNodeBuilder::new(), @@ -110,12 +208,19 @@ pub fn parse(src: &str) -> Parse { impl Parser<'_> { fn parse(mut self) -> Parse { - self.start_node(ROOT); + let evs = to_events(&self.tokens); + self.builder.start_node(ROOT.into()); - match self.expr(None) { - expr::ExprRes::Ok => (), - expr::ExprRes::Eof => (), - expr::ExprRes::NoExpr => todo!(), + self.tokens.reverse(); + + for ev in evs { + match ev { + Event::StartNode(kind) => self.builder.start_node(kind.into()), + Event::StartErr(SyntaxError) => todo!(), + Event::EatToken => self.bump(), + Event::FinishNode => self.builder.finish_node(), + Event::FinishErr => todo!(), + } } self.builder.finish_node(); @@ -124,13 +229,6 @@ impl Parser<'_> { } } - fn start_node(&mut self, kind: SyntaxKind) { - self.builder.start_node(kind.into()); - } - fn finish_node(&mut self) { - self.builder.finish_node(); - } - /// Advance one token, adding it to the current branch of the tree builder. fn bump(&mut self) { let (kind, text) = self.tokens.pop().unwrap(); @@ -143,7 +241,7 @@ impl Parser<'_> { } fn syntax_err_by_checkpoint(&mut self, checkpoint: Checkpoint, err: SyntaxError) { self.builder.start_node_at(checkpoint, PARSE_ERR.into()); - self.finish_node(); + self.builder.finish_node(); self.errors.push(err); } fn expected(&mut self, expected: SyntaxKind) { @@ -158,313 +256,4 @@ impl Parser<'_> { .get(self.tokens.len() - 2) .map(|(kind, _)| *kind) } - fn skip_ws(&mut self) { - while self.current() == Some(WHITESPACE) || self.current() == Some(NEWLINE) { - self.bump() - } - } - fn skip_ws_without_newlines(&mut self) { - while self.current() == Some(WHITESPACE) { - self.bump() - } - } -} - -mod expr { - use rowan::Checkpoint; - - use super::{attrset::AttrsetRes, instr::NodeRes, Parser}; - use crate::parser::{ast::lossless::lex::SyntaxKind::*, Span}; - impl Parser<'_> { - pub(super) fn expr(&mut self, start: Option) -> ExprRes { - self.skip_ws(); - let start = start.unwrap_or_else(|| self.builder.checkpoint()); - match self.current() { - Some(IDENT) => { - let expr_res = match self.instr() { - NodeRes::Ok => ExprRes::Ok, - NodeRes::Eof => ExprRes::Eof, - }; - self.builder.start_node_at(start, EXPR.into()); - self.finish_node(); - expr_res - } - Some(_) => self.atom(Some(start)), - None => ExprRes::Eof, - } - } - - pub(super) fn atom(&mut self, start: Option) -> ExprRes { - self.skip_ws(); - let start = start.unwrap_or_else(|| self.builder.checkpoint()); - match self.current() { - Some(INT_NUM | FLOAT_NUM | STRING) => { - self.bump(); - self.builder.start_node_at(start, EXPR.into()); - self.finish_node(); - ExprRes::Ok - } - Some(L_CURLY) => match self.attrset(start) { - AttrsetRes::Ok => ExprRes::Ok, - AttrsetRes::Eof => ExprRes::Eof, - }, - Some(L_PAREN) => { - self.builder.start_node_at(start, PARENTHESIZED_EXPR.into()); - self.bump(); - self.expr(None); - self.skip_ws(); - match self.current() { - Some(R_PAREN) => ExprRes::Ok, - Some(_) => todo!(), - None => ExprRes::Eof, - } - } - Some(_) => ExprRes::NoExpr, - None => ExprRes::Eof, - } - } - } - - pub enum ExprRes { - Ok, - Eof, - /// isnt an expression - NoExpr, - } -} - -mod attrset { - use chumsky::container::Container; - use rowan::Checkpoint; - - use super::{expr::ExprRes, instr::NodeRes, Parser}; - use crate::parser::{ - ast::lossless::{lex::SyntaxKind::*, parser::SyntaxError}, - Span, - }; - impl Parser<'_> { - pub(super) fn attrset(&mut self, checkpoint: Checkpoint) -> AttrsetRes { - assert_eq!(self.current(), Some(L_CURLY)); - self.bump(); - self.skip_ws(); - match self.current() { - Some(R_CURLY) => { - self.builder.start_node_at(checkpoint, ATTR_SET.into()); - self.bump(); - self.finish_node(); - AttrsetRes::Ok - } - Some(_) => { - self.builder.start_node_at(checkpoint, ATTR_SET.into()); - let res = match self.attrs() { - AttrRes::Eof => AttrsetRes::Eof, - AttrRes::RCurly | AttrRes::Ok => { - println!("curr: {:?}", self.current()); - AttrsetRes::Ok - } - }; - self.finish_node(); - res - } - None => AttrsetRes::Eof, - } - // self.start_node(ATTR); - } - - fn attrs(&mut self) -> AttrRes { - let mut res = AttrRes::Ok; - - while res == AttrRes::Ok { - println!("it: {:?}", self.tokens.last()); - match self.attr() { - AttrRes::Ok => { - self.skip_ws_without_newlines(); - println!( - "a: {:?}, {:?}", - self.tokens.last(), - self.tokens.get(self.tokens.len() - 2) - ); - println!("errs: {:?}", self.errors); - res = AttrRes::Ok; - let checkpoint_previous_end = self.builder.checkpoint(); - res = match self.current() { - Some(COMMA) => { - self.bump(); - AttrRes::Ok - } - Some(R_CURLY) => { - self.bump(); - res = AttrRes::Ok; - break; - } - Some(NEWLINE) => { - self.skip_ws(); - println!( - "b: {:?}, {:?}", - self.tokens.last(), - self.tokens.get(self.tokens.len() - 2) - ); - match self.current() { - Some(COMMA) => { - self.bump(); - AttrRes::Ok - } - Some(R_CURLY) => { - self.bump(); - res = AttrRes::Ok; - break; - } - Some(IDENT) => { - println!("wtf"); - self.syntax_err_by_checkpoint( - checkpoint_previous_end, - SyntaxError::ExpectedCommaBetweenAttrs, - ); - // self.syntax_err(SyntaxError::ExpectedCommaBetweenAttrs); - AttrRes::Ok - } - Some(_) => { - self.bump(); - AttrRes::Ok - } - None => { - res = AttrRes::Eof; - break; - } - } - } - Some(_) => { - self.bump(); - println!( - "c: {:?}, {:?}", - self.tokens.last(), - self.tokens.get(self.tokens.len() - 2) - ); - AttrRes::Ok - } - None => { - res = AttrRes::Eof; - break; - } - } - } - AttrRes::Eof => { - res = AttrRes::Eof; - break; - } - AttrRes::RCurly => { - res = AttrRes::RCurly; - break; - } - } - } - println!("toks_left: {:?}", self.tokens); - res - } - - fn attr(&mut self) -> AttrRes { - self.skip_ws(); - self.start_node(ATTR); - self.start_node(ATTR_NAME); - match self.current() { - Some(IDENT) => self.bump(), - Some(R_CURLY) => return AttrRes::Ok, - Some(_) => self.expected(IDENT), - None => return AttrRes::Eof, - } - self.finish_node(); - self.skip_ws(); - match self.current() { - Some(COLON) => self.bump(), - Some(R_CURLY) => { - self.expected(COLON); - return AttrRes::RCurly; - } - Some(_) => self.expected(COLON), - None => return AttrRes::Eof, - } - self.skip_ws(); - self.start_node(ATTR_VALUE); - match self.expr(None) { - ExprRes::Ok => self.bump(), - ExprRes::Eof => return AttrRes::Eof, - ExprRes::NoExpr => match self.current() { - Some(COMMA) => self.syntax_err(SyntaxError::AttrExpectedValue), - Some(R_CURLY) => { - self.syntax_err(SyntaxError::AttrExpectedValue); - return AttrRes::RCurly; - } - Some(_) => self.expected(EXPR), - None => unreachable!(), - }, - } - self.finish_node(); - self.finish_node(); - AttrRes::Ok - } - } - - #[derive(PartialEq, Eq)] - pub enum AttrsetRes { - Ok, - Eof, - } - - #[derive(PartialEq, Eq)] - enum AttrRes { - Ok, - Eof, - RCurly, - } -} - -mod instr { - use super::Parser; - use crate::parser::{ - ast::lossless::{lex::SyntaxKind::*, parser::expr::ExprRes}, - Span, - }; - - impl Parser<'_> { - pub(super) fn instr(&mut self) -> NodeRes { - assert_eq!(self.current(), Some(IDENT)); - self.skip_ws(); - self.start_node(INSTR); - self.instr_name(); - - // used to count positionals - let mut i = 0; - let params_checkpoint = self.builder.checkpoint(); - loop { - match self.expr(None) { - ExprRes::Ok => { - i += 1; - continue; - } - ExprRes::NoExpr | ExprRes::Eof => break, - } - } - if i >= 1 { - self.builder - .start_node_at(params_checkpoint, INSTR_PARAMS.into()); - self.finish_node(); - } - self.finish_node(); - NodeRes::Ok - } - - fn instr_name(&mut self) { - self.start_node(INSTR_NAME); - while self.current() == Some(IDENT) { - self.bump(); - self.skip_ws_without_newlines(); - } - self.finish_node(); - } - } - - pub(super) enum NodeRes { - Ok, - Eof, - } } diff --git a/flake.lock b/flake.lock index 7c3a06d..9719001 100644 --- a/flake.lock +++ b/flake.lock @@ -11,11 +11,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1710475558, - "narHash": "sha256-egKrPCKjy/cE+NqCj4hg2fNX/NwLCf0bRDInraYXDgs=", + "lastModified": 1712055811, + "narHash": "sha256-7FcfMm5A/f02yyzuavJe06zLa9hcMHsagE28ADcmQvk=", "owner": "cachix", "repo": "cachix", - "rev": "661bbb7f8b55722a0406456b15267b5426a3bda6", + "rev": "02e38da89851ec7fec3356a5c04bc8349cae0e30", "type": "github" }, "original": { @@ -33,11 +33,11 @@ "pre-commit-hooks": "pre-commit-hooks_2" }, "locked": { - "lastModified": 1712724616, - "narHash": "sha256-qs9uEbrOpp6oXcDOp5cpilyU52t78ZpEPATtaHRVLIU=", + "lastModified": 1712925466, + "narHash": "sha256-MJ6VxGNu/ftbn8SErJjBz80FUNXkZfcObHg/JP7wwAc=", "owner": "cachix", "repo": "devenv", - "rev": "d1a11d14dbe96a03c7f9068e4d3af05f283734e0", + "rev": "1af93652caf48bfeef6ba7d1cf59fc66e506e5c2", "type": "github" }, "original": { @@ -83,11 +83,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1712730246, - "narHash": "sha256-iB8bFj+07RHpmt+XuGGvYQk2Iwm12u6+DklGq/+Tg5s=", + "lastModified": 1712903033, + "narHash": "sha256-KcvsEm0h1mIwBHFAzWFBjGihnbf2fxpAaXOdVbUfAI4=", "owner": "nix-community", "repo": "fenix", - "rev": "d402ae4a5e5676722290470f61a5e8e3155b5487", + "rev": "c739f83545e625227f4d0af7fe2a71e69931fa4c", "type": "github" }, "original": { @@ -335,11 +335,11 @@ "nixpkgs-regression": "nixpkgs-regression_2" }, "locked": { - "lastModified": 1710500156, - "narHash": "sha256-zvCqeUO2GLOm7jnU23G4EzTZR7eylcJN+HJ5svjmubI=", + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", "owner": "domenkozar", "repo": "nix", - "rev": "c5bbf14ecbd692eeabf4184cc8d50f79c2446549", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", "type": "github" }, "original": { @@ -431,11 +431,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1710236354, - "narHash": "sha256-vWrciFdq49vve43g4pbi7NjmL4cwG1ifXnQx+dU3T5E=", + "lastModified": 1710796454, + "narHash": "sha256-lQlICw60RhH8sHTDD/tJiiJrlAfNn8FDI9c+7G2F0SE=", "owner": "cachix", "repo": "devenv-nixpkgs", - "rev": "829e73affeadfb4198a7105cbe3a03153d13edc9", + "rev": "06fb0f1c643aee3ae6838dda3b37ef0abc3c763b", "type": "github" }, "original": { @@ -447,11 +447,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1712608508, - "narHash": "sha256-vMZ5603yU0wxgyQeHJryOI+O61yrX2AHwY6LOFyV1gM=", + "lastModified": 1712791164, + "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6", + "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", "type": "github" }, "original": { @@ -463,11 +463,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1712608508, - "narHash": "sha256-vMZ5603yU0wxgyQeHJryOI+O61yrX2AHwY6LOFyV1gM=", + "lastModified": 1712791164, + "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4cba8b53da471aea2ab2b0c1f30a81e7c451f4b6", + "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", "type": "github" }, "original": { @@ -543,11 +543,11 @@ "nixpkgs-stable": "nixpkgs-stable_2" }, "locked": { - "lastModified": 1712055707, - "narHash": "sha256-4XLvuSIDZJGS17xEwSrNuJLL7UjDYKGJSbK1WWX2AK8=", + "lastModified": 1712897695, + "narHash": "sha256-nMirxrGteNAl9sWiOhoN5tIHyjBbVi5e2tgZUgZlK3Y=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "e35aed5fda3cc79f88ed7f1795021e559582093a", + "rev": "40e6053ecb65fcbf12863338a6dcefb3f55f1bf8", "type": "github" }, "original": { @@ -567,11 +567,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1712663608, - "narHash": "sha256-tN9ZL6kGppmHg84lxlpAlaN+kXWNctKK7Yitq/iXDEw=", + "lastModified": 1712818880, + "narHash": "sha256-VDxsvgj/bNypHq48tQWtc3VRbWvzlFjzKf9ZZIVO10Y=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "a5feb4f05f09adca661c869b1bf2324898cbaa43", + "rev": "657b33b0cb9bd49085202e91ad5b4676532c9140", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 3c8d815..caad7d6 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,7 @@ self, nixpkgs, devenv, + fenix, systems, ... } @ inputs: let @@ -24,6 +25,11 @@ forEachSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; + toolchain = with fenix.packages.${system}; + combine [ + default.toolchain + rust-analyzer + ]; in { default = devenv.lib.mkShell { inherit inputs pkgs; @@ -33,17 +39,18 @@ config, ... }: { - languages.rust = { - enable = true; - channel = "nightly"; - components = [ - "rustc" - "cargo" - "clippy" - "rustfmt" - "rust-src" - ]; - }; + # languages.rust = { + # enable = true; + # channel = "nightly"; + # components = [ + # "rustc" + # "cargo" + # "clippy" + # "rustfmt" + # "rust-src" + # "rust-analyzer" + # ]; + # }; pre-commit.hooks = { clippy.enable = false; @@ -59,7 +66,7 @@ mold cargo-nextest cargo-watch - rust-analyzer + toolchain ]; }) ]; diff --git a/testfiles/test.owo b/testfiles/test.owo index 3662b45..78cbbda 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1 @@ -meow mew meow 5 3.14 "uwu" { - meow: test 24 - another: hi "hello", -} "awa" +hello world test 42 3.14 "uwu" From be637846b15bc019f888ec9e56a5d6680d272843 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 12 Apr 2024 21:31:55 +0200 Subject: [PATCH 115/189] lang: kinda fun parsing things that can now parse attribute sets with one attribute --- crates/lang/src/parser/ast/lossless/parser.rs | 66 ++++++++++++++----- testfiles/test.owo | 8 ++- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs index adcb08e..dc7868d 100644 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -40,7 +40,7 @@ pub mod parser_to_events { } pub fn to_events(tokens: &[(SyntaxKind, &str)]) -> Vec { - let mut only_toks: Vec = tokens.iter().map(|(t, _)| *t).collect(); + let only_toks: Vec = tokens.iter().map(|(t, _)| *t).collect(); let res = parser().parse(&only_toks); res.unwrap() } @@ -60,27 +60,28 @@ pub mod parser_to_events { }) }}; } + macro_rules! parenthesized { + ($parser:expr) => { + just(L_PAREN) + .to(vec![Event::EatToken]) + .then($parser) + .then(just(R_PAREN).to(vec![Event::EatToken])) + .map(|((mut before, mut c), mut after)| { + before.insert(0, Event::StartNode(PARENTHESIZED_EXPR)); + before.append(&mut c); + before.append(&mut after); + before.push(Event::FinishNode); + before + }) + }; + } pub fn parser<'toks>() -> impl Parser<'toks, &'toks [SyntaxKind], Vec> { let ws = one_of([WHITESPACE, NEWLINE]) .to(Event::EatToken) .repeated() .collect::>(); - // let ws_without_newlines = just(WHITESPACE) - // .to(Event::EatToken) - // .repeated() - // .collect::>(); - let parenthesized = |c| { - just(L_PAREN) - .to(vec![Event::EatToken]) - .then(c) - .then(just(R_PAREN).to(vec![Event::EatToken])) - .map(|((mut before, mut c), mut after)| { - before.append(&mut c); - before.append(&mut after); - before - }) - }; + let ident = just(IDENT).to(vec![Event::EatToken]); let expr = recursive(|expr| { let lit = one_of([INT_NUM, FLOAT_NUM, STRING]).to(vec![ @@ -88,10 +89,39 @@ pub mod parser_to_events { Event::EatToken, Event::FinishNode, ]); + let attrset = just(L_CURLY) + .then( + padded!(just(IDENT).to(vec![ + Event::StartNode(ATTR), + Event::StartNode(ATTR_NAME), + Event::EatToken, + Event::FinishNode + ])) + .then(just(COLON)) + .then(padded!(expr.clone().map(|mut exp: Vec| { + exp.insert(0, Event::StartNode(ATTR_VALUE)); + exp.push(Event::FinishNode); + exp.push(Event::FinishNode); + exp + }))) + .map(|((mut name, _), mut value)| { + // colon + name.push(Event::EatToken); + name.append(&mut value); + name + }), + ) + .then(just(R_CURLY)) + .map(|((_, mut attrs), _)| { + attrs.insert(0, Event::StartNode(ATTR_SET)); + attrs.insert(0, Event::EatToken); + attrs.push(Event::EatToken); + attrs.push(Event::FinishNode); + attrs + }); - let atom = lit.clone().or(parenthesized(expr)); + let atom = lit.clone().or(attrset).or(parenthesized!(expr)); - let ident = just(IDENT).to(vec![Event::EatToken]); let instr_name = ident .clone() .map(|mut v| { diff --git a/testfiles/test.owo b/testfiles/test.owo index 78cbbda..dc95a8d 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1,7 @@ -hello world test 42 3.14 "uwu" +hello world test + 42 + (another command 3.14 "meow") + "uwu" + { + some: attrs 42 (meow gay 1) + } From 6d8b79e8f7b812c3cc51875470fdb934d58fccd6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 15 Apr 2024 16:22:33 +0200 Subject: [PATCH 116/189] lang: apparently add event debug printer --- crates/lang/src/parser/ast/lossless/parser.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs index dc7868d..3a9c11d 100644 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ b/crates/lang/src/parser/ast/lossless/parser.rs @@ -240,6 +240,7 @@ impl Parser<'_> { fn parse(mut self) -> Parse { let evs = to_events(&self.tokens); self.builder.start_node(ROOT.into()); + println!("evs: {evs:?}"); self.tokens.reverse(); From 381ab45edcf496ec1ed6b564602e41a0a52ecf66 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 11:07:38 +0200 Subject: [PATCH 117/189] lang: rewrite parser --- Cargo.lock | 215 +++++-------- crates/lang/Cargo.toml | 3 +- crates/lang/src/err_reporting.rs | 88 ------ crates/lang/src/lib.rs | 4 +- crates/lang/src/main.rs | 24 +- crates/lang/src/parser.rs | 257 ++++++++-------- crates/lang/src/parser/ast.rs | 24 -- crates/lang/src/parser/ast/ast_tree.rs | 31 -- crates/lang/src/parser/ast/lossless.rs | 19 -- crates/lang/src/parser/ast/lossless/parser.rs | 290 ------------------ crates/lang/src/parser/ast/raw_ast.rs | 50 --- crates/lang/src/parser/error.rs | 6 + crates/lang/src/parser/events.rs | 23 ++ crates/lang/src/parser/grammar.rs | 14 + crates/lang/src/parser/grammar/expression.rs | 14 + .../parser/grammar/expression/instruction.rs | 30 ++ .../lang/src/parser/grammar/expression/lit.rs | 20 ++ crates/lang/src/parser/input.rs | 61 ++++ crates/lang/src/parser/output.rs | 113 +++++++ crates/lang/src/parser/parser.rs | 6 + .../{ast/lossless/lex.rs => syntax_kind.rs} | 27 +- crates/lang/src/parser/tests.rs | 142 --------- crates/lang/src/tokens.rs | 81 ----- crates/lang/src/tokens/tests.rs | 135 -------- testfiles/test.owo | 8 +- 25 files changed, 524 insertions(+), 1161 deletions(-) delete mode 100644 crates/lang/src/err_reporting.rs delete mode 100644 crates/lang/src/parser/ast.rs delete mode 100644 crates/lang/src/parser/ast/ast_tree.rs delete mode 100644 crates/lang/src/parser/ast/lossless.rs delete mode 100644 crates/lang/src/parser/ast/lossless/parser.rs delete mode 100644 crates/lang/src/parser/ast/raw_ast.rs create mode 100644 crates/lang/src/parser/error.rs create mode 100644 crates/lang/src/parser/events.rs create mode 100644 crates/lang/src/parser/grammar.rs create mode 100644 crates/lang/src/parser/grammar/expression.rs create mode 100644 crates/lang/src/parser/grammar/expression/instruction.rs create mode 100644 crates/lang/src/parser/grammar/expression/lit.rs create mode 100644 crates/lang/src/parser/input.rs create mode 100644 crates/lang/src/parser/output.rs create mode 100644 crates/lang/src/parser/parser.rs rename crates/lang/src/parser/{ast/lossless/lex.rs => syntax_kind.rs} (74%) delete mode 100644 crates/lang/src/tokens.rs delete mode 100644 crates/lang/src/tokens/tests.rs diff --git a/Cargo.lock b/Cargo.lock index a25751d..d759c0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,33 +8,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - [[package]] name = "anstream" version = "0.6.5" @@ -160,31 +133,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "cc" -version = "1.0.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" - [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chumsky" -version = "1.0.0-alpha.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7b80276986f86789dc56ca6542d53bba9cda3c66091ebbe7bd96fc1bdf20f1f" -dependencies = [ - "hashbrown", - "regex-automata", - "serde", - "stacker", - "unicode-ident", -] - [[package]] name = "clap" version = "4.4.12" @@ -298,6 +252,40 @@ dependencies = [ "phf", ] +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "deranged" version = "0.3.11" @@ -328,6 +316,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "drop_bomb" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1" + [[package]] name = "ego-tree" version = "0.6.2" @@ -340,6 +334,27 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "enumset" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -447,10 +462,6 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", - "allocator-api2", -] [[package]] name = "heck" @@ -458,6 +469,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "image" version = "0.24.7" @@ -516,9 +533,10 @@ name = "lang" version = "0.1.0" dependencies = [ "ariadne", - "chumsky", "clap", + "drop_bomb", "ego-tree", + "enumset", "indexmap", "logos", "petgraph", @@ -584,7 +602,7 @@ dependencies = [ "lazy_static", "proc-macro2", "quote", - "regex-syntax 0.8.2", + "regex-syntax", "syn", ] @@ -661,12 +679,6 @@ dependencies = [ "libc", ] -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - [[package]] name = "option-ext" version = "0.2.0" @@ -759,15 +771,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "psm" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" -dependencies = [ - "cc", -] - [[package]] name = "qoi" version = "0.4.1" @@ -851,23 +854,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "regex-automata" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.5", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - [[package]] name = "regex-syntax" version = "0.8.2" @@ -975,19 +961,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "stacker" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "winapi", -] - [[package]] name = "strsim" version = "0.10.0" @@ -1090,12 +1063,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1108,28 +1075,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" version = "0.48.0" @@ -1268,26 +1213,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zune-inflate" version = "0.2.54" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 3e03209..fba2bcf 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -7,13 +7,14 @@ edition = "2021" [dependencies] logos = "0.14" -chumsky = {version= "1.0.0-alpha.7", features=["label", "extension"]} petgraph = { workspace = true} indexmap = "2.2.6" clap = { version = "4", features = ["derive"] } ariadne = "0.4.0" ego-tree = "0.6.2" rowan = "0.15.15" +drop_bomb = "0.1.5" +enumset = "1.1.3" [lints] workspace = true diff --git a/crates/lang/src/err_reporting.rs b/crates/lang/src/err_reporting.rs deleted file mode 100644 index ebf7866..0000000 --- a/crates/lang/src/err_reporting.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::{collections::HashMap, fs}; - -use ariadne::{sources, Label, Report, Source}; -use chumsky::{ - error::{self, Rich}, - ParseResult, -}; -use indexmap::IndexMap; - -use crate::{ - parser::{ast::File, Span}, - tokens::Token, -}; - -#[derive(Debug, PartialEq, Eq, Hash)] -pub enum Stage { - Lex, - Parse, -} - -impl Stage { - fn variants() -> [Stage; 2] { - [Stage::Lex, Stage::Parse] - } -} - -pub struct ErrorCollector<'filename, 'tokens, 'src> { - files: HashMap<&'filename str, &'src str>, - raw_errors: IndexMap<(&'filename str, Stage), Vec, Span>>>, -} - -impl<'filename, 'tokens, 'src> ErrorCollector<'filename, 'tokens, 'src> { - pub fn new(files: Vec<(&'filename str, &'src str)>) -> Self { - Self { - files: HashMap::from_iter(files.clone()), - raw_errors: files - .iter() - .flat_map(|(name, _)| Stage::variants().map(|s| (name, s))) - .map(|(name, stage)| ((*name, stage), Vec::new())) - .collect(), - } - } - - pub fn insert_many( - &mut self, - file: &'filename str, - curr_stage: Stage, - mut errs: Vec, Span>>, - ) { - let err_vec = self - .raw_errors - .get_mut(&(file, curr_stage)) - .expect("filename should exist"); - err_vec.append(&mut errs); - } - - pub fn analyze_and_report(self) { - let ErrorCollector { files, raw_errors } = self; - todo!() - } - - pub fn report_raw(self) { - let ErrorCollector { files, raw_errors } = self; - - for ((file, stage), errs) in raw_errors.into_iter() { - for err in errs { - eprintln!("e: {err:?}"); - Report::build(ariadne::ReportKind::Error, file, err.span().start) - .with_message(format!("error at stage {stage:?}, {:?}", err.reason())) - .with_label( - Label::new((file, err.span().into_range())).with_message(format!( - "found: {:?}", - err.found().expect("errors should have a reason") - )), - ) - .with_help(format!( - "expected: {:?}", - err.expected().collect::>() - )) - .finish() - .print((file, Source::from(files[file]))); - } - } - } -} - -#[derive(Debug, PartialEq, Eq)] -struct Loc<'filename>(&'filename str, Span); diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index ebf22d3..1b08789 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,4 +1,2 @@ -#![feature(type_alias_impl_trait)] -pub mod err_reporting; +#![feature(type_alias_impl_trait, lint_reasons)] pub mod parser; -pub mod tokens; diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 346862e..6b1caa0 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,12 +1,9 @@ +use clap::Parser; use std::{fs, path::PathBuf}; -use clap::Parser; -use lang::{ - err_reporting::ErrorCollector, - parser::ast::lossless::{ - lex, - parser::{self, parse}, - }, +use lang::parser::{ + parser::{self, grammar, input, output::Output}, + syntax_kind, }; #[derive(Parser)] @@ -19,8 +16,17 @@ fn main() { let args = Args::parse(); let n = args.file.clone(); let f = fs::read_to_string(n.clone()).expect("failed to read file"); - println!("toks: {:?}", lex::lex(&f)); - println!("parse res: {:?}", parse(&f)); + + let toks = dbg!(syntax_kind::lex(&f)); + let input = input::Input::new(&toks); + let mut parser = parser::Parser::new(input); + + grammar::source_file(&mut parser); + + let p_out = dbg!(parser.finish()); + let o = Output::from_parser_output(toks, p_out); + + println!("Out: {:?}", o); // let parse_res = parser::parse(&f); // println!("parse: {:?}", parse_res); diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index b1ee34b..e850ab0 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -1,152 +1,143 @@ -use chumsky::{ - error::Rich, - input::{Stream, ValueInput}, - prelude::*, - primitive::just, - recursive::recursive, - span::SimpleSpan, - IterParser, -}; -use indexmap::IndexMap; -use logos::Logos; +use drop_bomb::DropBomb; -use crate::tokens::Token; +use self::{error::SyntaxError, events::Event, input::Input, syntax_kind::SyntaxKind}; -pub mod ast; +pub mod syntax_kind; #[cfg(test)] mod tests; -use self::ast::{ - raw_ast::{RawExpr, RawExpression}, - File, -}; -pub type Span = SimpleSpan; -pub type Spanned = (T, Span); +pub mod error; +pub mod events; +pub mod grammar; +pub mod input; +pub mod output; -pub fn parse(src: &str) -> ParseResult, Rich<'_, Token<'_>>> { - let toks: Vec<_> = Token::lexer(src) - .spanned() - .map(|(t, s)| (t.expect("TODO: add lexer error(s)"), Span::from(s))) - .collect(); - let tok_stream = Stream::from_iter(toks).spanned((src.len()..src.len()).into()); - parser().parse(tok_stream) +pub struct Parser<'src, 'toks> { + input: Input<'src, 'toks>, + pos: usize, + events: Vec, + errors: Vec, } -pub(crate) fn parser< - 'tokens, - 'src: 'tokens, - I: ValueInput<'tokens, Token = Token<'src>, Span = Span>, ->() -> impl Parser<'tokens, I, File<'src>, extra::Err, Span>>> { - let word = select! { Token::Word(word) = e => (word, e.span())}; - let expr = recursive(|expr| { - let lit = select! { - Token::Int(i) = e => RawExpression::new(RawExpr::Lit(ast::Lit::Int(i.parse().expect("TODO: handle better"))), e.span()), - Token::Float(f) = e => RawExpression::new(RawExpr::Lit(ast::Lit::Float(f.parse().expect("TODO: handle better"))), e.span()), - Token::String(s) = e => RawExpression::new(RawExpr::Lit(ast::Lit::String(s.strip_prefix('"').expect("a").strip_suffix('"').expect("b"))), e.span()) - }; - let mat = just(Token::Mat) - .ignore_then(select! { Token::Dimensions(dimensions) = e => (dimensions, e.span())}) - .then( - lit.separated_by(just(Token::Comma)) - .collect::>() - .separated_by(just(Token::Semicolon)) - .collect::>() - .delimited_by(just(Token::BracketOpen), just(Token::BracketClose)), - ) - .map_with(|(dimensions, data), e| { - // TODO: Validation and proper error handling/reporting - // (validation = validating the matrix dimensions) - RawExpression::new( - RawExpr::Matrix(dimensions, data.into_iter().flatten().collect()), - e.span(), - ) - }); - let var = select! { - Token::VarIdent(name) => (RawExpr::Var as fn(_) -> _, name), - Token::InputIdent(name) => (RawExpr::InputVar as fn(_) -> _, name) +impl<'src, 'toks> Parser<'src, 'toks> { + pub fn new(input: Input<'src, 'toks>) -> Self { + Self { + input, + pos: 0, + events: Vec::new(), + errors: Vec::new(), } - .map_with(|(item_type, name), extra| RawExpression::new(item_type(name), extra.span())) - .labelled("variable"); + } - let attrset = word - .labelled("attr name") - .then_ignore(just(Token::Colon)) - .then(expr) - .labelled("attr body") - .separated_by(just(Token::Comma)) - .collect::>() - .map(IndexMap::from_iter) - .delimited_by(just(Token::BraceOpen), just(Token::BraceClose)) - .map_with(|v, e| (v, e.span())) - .labelled("attrset"); + pub fn finish(self) -> (Vec, Vec) { + (self.events, self.errors) + } - let node = word - .repeated() - .collect() - .then(attrset.clone().or_not()) - .map_with(|(name, params), extra| { - RawExpression::new(RawExpr::Node(name, params), extra.span()) - }) - // .or(var) - // .or(attrset - // .map_with(|attrset, extra| Expression::new(Expr::AttrSet(attrset), extra.span()))) - // .or(lit) - // .or(mat) - .labelled("node"); + pub(crate) fn nth(&self, n: usize) -> SyntaxKind { + self.input.kind(self.pos + n) + } - let atom = var - .or(lit) - .or(mat) - .or(attrset.map_with(|attrset, extra| { - RawExpression::new(RawExpr::AttrSet(attrset), extra.span()) - })) - .or(node.clone()); - - #[allow(clippy::let_and_return)] - let pipeline = atom - .clone() - .then(choice(( - just(Token::Pipe).to(RawExpr::SimplePipe as fn(_, _) -> _), - just(Token::MappingPipe).to(RawExpr::MappingPipe as fn(_, _) -> _), - just(Token::NullPipe).to(RawExpr::NullPipe as fn(_, _) -> _), - ))) - .repeated() - .foldr_with(atom, |(curr, pipe), next, extra| { - RawExpression::new(pipe(curr, next), extra.span()) - }); - - pipeline - }); - - let decls = just(Token::Def) - .ignore_then( - word.then_ignore(just(Token::Equals)) - .then(expr.clone().map(|expr| expr)) - .then_ignore(just(Token::Semicolon)), - ) - .repeated() - .collect::>() - .map(|decls| File { - decls: IndexMap::from_iter(decls), + pub fn eat_succeeding_ws(&mut self) { + self.push_ev(Event::Eat { + count: self.input.meaningless_tail_len(), }); + } - let single_expr = expr.map(|expr| File { - decls: IndexMap::from_iter([(("main", (0..0).into()), expr)]), - }); + pub(crate) fn current(&self) -> SyntaxKind { + self.input.kind(self.pos) + } - just(Token::Def).rewind().ignore_then(decls).or(single_expr) - // single_expr.or(decls) + pub(crate) fn start(&mut self) -> Marker { + let pos = self.events.len(); + self.push_ev(Event::tombstone()); + Marker::new(pos) + } - // expr.map(|expr| File { - // decls: IndexMap::from_iter([(("main", (0..0).into()), expr)]), - // }) - // .or(decl.repeated().collect::>().map(|decls| File { - // decls: IndexMap::from_iter(decls), - // })) + pub(crate) fn at(&self, kind: SyntaxKind) -> bool { + self.nth_at(0, kind) + } + + pub(crate) fn eat(&mut self, kind: SyntaxKind) -> bool { + if !self.at(kind) { + return false; + } + + self.do_bump(); + true + } + + pub(crate) fn nth_at(&self, n: usize, kind: SyntaxKind) -> bool { + self.nth(n) == kind + } + + fn do_bump(&mut self) { + self.push_ev(Event::Eat { + count: self.input.preceding_meaningless(self.pos), + }); + self.pos += 1; + } + + fn push_ev(&mut self, event: Event) { + self.events.push(event) + } } -pub mod asg { - use petgraph::graph::DiGraph; - - use super::Spanned; +pub(crate) struct Marker { + pos: usize, + bomb: DropBomb, +} + +impl Marker { + pub(crate) fn new(pos: usize) -> Self { + Self { + pos, + bomb: DropBomb::new("Marker must be completed or abandoned"), + } + } + pub(crate) fn complete(mut self, p: &mut Parser<'_, '_>, kind: SyntaxKind) -> CompletedMarker { + self.bomb.defuse(); + match &mut p.events[self.pos] { + Event::Start { kind: slot, .. } => *slot = kind, + _ => unreachable!(), + } + p.push_ev(Event::Finish); + + CompletedMarker { + pos: self.pos, + kind, + } + } + + pub(crate) fn abandon(mut self, p: &mut Parser<'_, '_>) { + self.bomb.defuse(); + if self.pos == p.events.len() - 1 { + match p.events.pop() { + Some(Event::Start { + kind: SyntaxKind::TOMBSTONE, + forward_parent: None, + }) => (), + _ => unreachable!(), + } + } + } +} + +pub(crate) struct CompletedMarker { + pos: usize, + kind: SyntaxKind, +} + +impl CompletedMarker { + pub(crate) fn precede(self, p: &mut Parser<'_, '_>) -> Marker { + let new_pos = p.start(); + + match &mut p.events[self.pos] { + Event::Start { forward_parent, .. } => { + *forward_parent = Some(new_pos.pos - self.pos); + } + _ => unreachable!(), + } + + new_pos + } } diff --git a/crates/lang/src/parser/ast.rs b/crates/lang/src/parser/ast.rs deleted file mode 100644 index d45ef66..0000000 --- a/crates/lang/src/parser/ast.rs +++ /dev/null @@ -1,24 +0,0 @@ -use std::collections::{BTreeMap, HashMap}; - -use indexmap::IndexMap; - -use super::Spanned; - -#[derive(Debug, PartialEq)] -pub struct File<'src> { - pub decls: IndexMap, raw_ast::RawExpression<'src>>, -} - -pub mod raw_ast; - -#[derive(Debug, PartialEq)] -pub enum Lit<'src> { - // TODO: more bigger better number types - Int(i64), - Float(f64), - String(&'src str), -} - -pub mod lossless; - -pub mod ast_tree; diff --git a/crates/lang/src/parser/ast/ast_tree.rs b/crates/lang/src/parser/ast/ast_tree.rs deleted file mode 100644 index 46db4e9..0000000 --- a/crates/lang/src/parser/ast/ast_tree.rs +++ /dev/null @@ -1,31 +0,0 @@ -use ego_tree::Tree; - -use crate::parser::Spanned; - -use super::{File, Lit}; - -pub struct Ast<'src> { - tree: Tree>, -} - -struct AstNode<'src> { - kind: NodeKind<'src>, -} - -enum NodeKind<'src> { - Decl, - Ident(&'src str), - Instr, - Expr, - MappingPipe, - NullPipe, - MultiPipe, - Var(&'src str), - InputVar(&'src str), - AttrSet, - Attr, - Lit(Lit<'src>), - Matrix, - Dimensions(u16, u16), - MatrixRow, -} diff --git a/crates/lang/src/parser/ast/lossless.rs b/crates/lang/src/parser/ast/lossless.rs deleted file mode 100644 index 0047441..0000000 --- a/crates/lang/src/parser/ast/lossless.rs +++ /dev/null @@ -1,19 +0,0 @@ -use self::lex::SyntaxKind; - -pub mod parser; - -pub mod lex; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -enum Lang {} -impl rowan::Language for Lang { - type Kind = SyntaxKind; - #[allow(unsafe_code)] - fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind { - assert!(raw.0 <= SyntaxKind::ROOT as u16); - unsafe { std::mem::transmute::(raw.0) } - } - fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind { - kind.into() - } -} diff --git a/crates/lang/src/parser/ast/lossless/parser.rs b/crates/lang/src/parser/ast/lossless/parser.rs deleted file mode 100644 index 3a9c11d..0000000 --- a/crates/lang/src/parser/ast/lossless/parser.rs +++ /dev/null @@ -1,290 +0,0 @@ -use std::borrow::Borrow; - -use rowan::{ - Checkpoint, GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken, -}; - -use crate::parser::{ - ast::lossless::{lex::SyntaxKind::*, Lang}, - Span, -}; - -use self::parser_to_events::{to_events, Event}; - -use super::lex::{self, SyntaxKind}; - -pub mod parser_to_events { - use chumsky::prelude::*; - - use crate::parser::ast::lossless::lex::{ - self, - SyntaxKind::{self, *}, - }; - - #[derive(Debug, PartialEq, Eq, Clone, Copy)] - pub enum Event { - StartNode(SyntaxKind), - StartErr(SyntaxError), - EatToken, - FinishNode, - FinishErr, - } - - #[derive(Debug, PartialEq, Eq, Clone, Copy)] - pub enum SyntaxError { - Expected(SyntaxKind), - AttrExpectedValue, - /// guessed if there's a newline and attr on next line without comma - /// should then suggest comma after attr - ExpectedCommaBetweenAttrs, - } - - pub fn to_events(tokens: &[(SyntaxKind, &str)]) -> Vec { - let only_toks: Vec = tokens.iter().map(|(t, _)| *t).collect(); - let res = parser().parse(&only_toks); - res.unwrap() - } - - macro_rules! padded { - ($parser:expr) => {{ - let ws = one_of([WHITESPACE, NEWLINE]) - .to(Event::EatToken) - .repeated() - .collect::>(); - ws.then($parser) - .then(ws) - .map(|((mut before, mut c), mut after)| { - before.append(&mut c); - before.append(&mut after); - before - }) - }}; - } - macro_rules! parenthesized { - ($parser:expr) => { - just(L_PAREN) - .to(vec![Event::EatToken]) - .then($parser) - .then(just(R_PAREN).to(vec![Event::EatToken])) - .map(|((mut before, mut c), mut after)| { - before.insert(0, Event::StartNode(PARENTHESIZED_EXPR)); - before.append(&mut c); - before.append(&mut after); - before.push(Event::FinishNode); - before - }) - }; - } - - pub fn parser<'toks>() -> impl Parser<'toks, &'toks [SyntaxKind], Vec> { - let ws = one_of([WHITESPACE, NEWLINE]) - .to(Event::EatToken) - .repeated() - .collect::>(); - let ident = just(IDENT).to(vec![Event::EatToken]); - - let expr = recursive(|expr| { - let lit = one_of([INT_NUM, FLOAT_NUM, STRING]).to(vec![ - Event::StartNode(EXPR), - Event::EatToken, - Event::FinishNode, - ]); - let attrset = just(L_CURLY) - .then( - padded!(just(IDENT).to(vec![ - Event::StartNode(ATTR), - Event::StartNode(ATTR_NAME), - Event::EatToken, - Event::FinishNode - ])) - .then(just(COLON)) - .then(padded!(expr.clone().map(|mut exp: Vec| { - exp.insert(0, Event::StartNode(ATTR_VALUE)); - exp.push(Event::FinishNode); - exp.push(Event::FinishNode); - exp - }))) - .map(|((mut name, _), mut value)| { - // colon - name.push(Event::EatToken); - name.append(&mut value); - name - }), - ) - .then(just(R_CURLY)) - .map(|((_, mut attrs), _)| { - attrs.insert(0, Event::StartNode(ATTR_SET)); - attrs.insert(0, Event::EatToken); - attrs.push(Event::EatToken); - attrs.push(Event::FinishNode); - attrs - }); - - let atom = lit.clone().or(attrset).or(parenthesized!(expr)); - - let instr_name = ident - .clone() - .map(|mut v| { - v.insert(0, Event::StartNode(INSTR_NAME)); - v - }) - .foldl( - ws.then(ident).repeated(), - |mut ident, (mut ws, mut next)| { - ident.append(&mut ws); - ident.append(&mut next); - ident - }, - ) - .map(|mut v| { - v.push(Event::FinishNode); - v - }); - let instr = padded!(instr_name) - .then( - atom.clone() - .map(|mut v| { - v.insert(0, Event::StartNode(INSTR_PARAMS)); - v - }) - .foldl( - ws.then(atom.clone()).repeated(), - |mut cur, (mut ws, mut next)| { - cur.append(&mut ws); - cur.append(&mut next); - cur - }, - ) - .map(|mut v| { - v.push(Event::FinishNode); - v - }), - ) - .map(|(mut name, mut params)| { - name.insert(0, Event::StartNode(INSTR)); - name.append(&mut params); - name.push(Event::FinishNode); - name - }); - padded!(instr.or(lit).or(atom)) - }); - expr - // .map(|(lit, mut ev)| lit.append(&mut ev)); - } -} - -#[derive(PartialEq, Eq)] -pub struct Parse { - pub green_node: GreenNode, -} - -impl std::fmt::Debug for Parse { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - debug_print_green_node(NodeOrToken::Node(self.green_node.borrow()), f, 0) - } -} - -fn debug_print_green_node( - node: NodeOrToken<&GreenNodeData, &GreenTokenData>, - f: &mut std::fmt::Formatter<'_>, - lvl: i32, -) -> std::fmt::Result { - for _ in 0..lvl { - f.write_str(" ")?; - } - - match node { - NodeOrToken::Node(n) => { - writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind())); - for c in n.children() { - debug_print_green_node(c, f, lvl + 1)?; - } - for _ in 0..lvl { - f.write_str(" ")?; - } - f.write_str("}\n") - } - NodeOrToken::Token(t) => { - writeln!(f, "{:?} {:?};", Lang::kind_from_raw(t.kind()), t.text()) - } - } -} - -#[derive(Debug)] -struct Parser<'src> { - tokens: Vec<(SyntaxKind, &'src str)>, - builder: GreenNodeBuilder<'src>, - errors: Vec, -} - -#[derive(Debug, PartialEq, Eq)] -enum SyntaxError { - Expected(SyntaxKind), - AttrExpectedValue, - /// guessed if there's a newline and attr on next line without comma - /// should then suggest comma after attr - ExpectedCommaBetweenAttrs, -} - -pub fn parse(src: &str) -> Parse { - let tokens = lex::lex(src); - Parser { - tokens, - builder: GreenNodeBuilder::new(), - errors: Vec::new(), - } - .parse() -} - -impl Parser<'_> { - fn parse(mut self) -> Parse { - let evs = to_events(&self.tokens); - self.builder.start_node(ROOT.into()); - println!("evs: {evs:?}"); - - self.tokens.reverse(); - - for ev in evs { - match ev { - Event::StartNode(kind) => self.builder.start_node(kind.into()), - Event::StartErr(SyntaxError) => todo!(), - Event::EatToken => self.bump(), - Event::FinishNode => self.builder.finish_node(), - Event::FinishErr => todo!(), - } - } - - self.builder.finish_node(); - Parse { - green_node: self.builder.finish(), - } - } - - /// Advance one token, adding it to the current branch of the tree builder. - fn bump(&mut self) { - let (kind, text) = self.tokens.pop().unwrap(); - self.builder.token(kind.into(), text); - } - fn syntax_err(&mut self, err: SyntaxError) { - let (_, text) = self.tokens.pop().unwrap(); - self.builder.token(PARSE_ERR.into(), text); - self.errors.push(err); - } - fn syntax_err_by_checkpoint(&mut self, checkpoint: Checkpoint, err: SyntaxError) { - self.builder.start_node_at(checkpoint, PARSE_ERR.into()); - self.builder.finish_node(); - self.errors.push(err); - } - fn expected(&mut self, expected: SyntaxKind) { - self.syntax_err(SyntaxError::Expected(expected)) - } - /// Peek at the first unprocessed token - fn current(&self) -> Option { - self.tokens.last().map(|(kind, _)| *kind) - } - fn next(&self) -> Option { - self.tokens - .get(self.tokens.len() - 2) - .map(|(kind, _)| *kind) - } -} diff --git a/crates/lang/src/parser/ast/raw_ast.rs b/crates/lang/src/parser/ast/raw_ast.rs deleted file mode 100644 index a0ec749..0000000 --- a/crates/lang/src/parser/ast/raw_ast.rs +++ /dev/null @@ -1,50 +0,0 @@ -use indexmap::IndexMap; - -use super::super::Spanned; - -use super::super::Span; -use super::Lit; - -#[derive(Debug, PartialEq)] -pub struct RawExpression<'src> { - pub expr: Box>, - pub span: Span, -} - -impl<'src> RawExpression<'src> { - pub fn new(expr: RawExpr<'src>, span: Span) -> Self { - Self { - expr: Box::new(expr), - span, - } - } -} - -#[derive(Debug, PartialEq)] -pub enum RawExpr<'src> { - Node( - Vec>, - Option, RawExpression<'src>>>>, - ), - SimplePipe(RawExpression<'src>, RawExpression<'src>), - // NamingPipe( - // Box>, - // (Vec>, Vec>), - // Box>, - // ), - MappingPipe(RawExpression<'src>, RawExpression<'src>), - NullPipe(RawExpression<'src>, RawExpression<'src>), - MultiPipe(IndexMap, RawExpression<'src>>), - // LetIn( - // IndexMap, Box>>, - // Box>, - // ), - // $ - Var(&'src str), - // @ - InputVar(&'src str), - AttrSet(Spanned, RawExpression<'src>>>), - Lit(Lit<'src>), - Matrix(Spanned<(u16, u16)>, Vec>), - List(Vec>), -} diff --git a/crates/lang/src/parser/error.rs b/crates/lang/src/parser/error.rs new file mode 100644 index 0000000..698ecaf --- /dev/null +++ b/crates/lang/src/parser/error.rs @@ -0,0 +1,6 @@ +use crate::parser::syntax_kind::SyntaxKind; + +#[derive(Debug)] +pub enum SyntaxError { + Expected(Vec), +} diff --git a/crates/lang/src/parser/events.rs b/crates/lang/src/parser/events.rs new file mode 100644 index 0000000..6fc5b2c --- /dev/null +++ b/crates/lang/src/parser/events.rs @@ -0,0 +1,23 @@ +use crate::parser::syntax_kind::SyntaxKind; + +#[derive(Debug)] +pub enum Event { + Start { + kind: SyntaxKind, + forward_parent: Option, + }, + Finish, + Eat { + count: usize, + }, + Error, +} + +impl Event { + pub(crate) fn tombstone() -> Self { + Self::Start { + kind: SyntaxKind::TOMBSTONE, + forward_parent: None, + } + } +} diff --git a/crates/lang/src/parser/grammar.rs b/crates/lang/src/parser/grammar.rs new file mode 100644 index 0000000..f301d4e --- /dev/null +++ b/crates/lang/src/parser/grammar.rs @@ -0,0 +1,14 @@ +use crate::parser::syntax_kind::SyntaxKind::*; + +use super::Parser; + +mod expression; + +pub fn source_file(p: &mut Parser) { + let root = p.start(); + + expression::expression(p); + p.eat_succeeding_ws(); + + root.complete(p, ROOT); +} diff --git a/crates/lang/src/parser/grammar/expression.rs b/crates/lang/src/parser/grammar/expression.rs new file mode 100644 index 0000000..18323a5 --- /dev/null +++ b/crates/lang/src/parser/grammar/expression.rs @@ -0,0 +1,14 @@ +use crate::parser::{syntax_kind::SyntaxKind::*, Parser}; + +use self::{instruction::instr, lit::literal}; + +mod instruction; +mod lit; + +pub fn expression(p: &mut Parser) { + let expr = p.start(); + + instr(p); + + expr.complete(p, EXPR); +} diff --git a/crates/lang/src/parser/grammar/expression/instruction.rs b/crates/lang/src/parser/grammar/expression/instruction.rs new file mode 100644 index 0000000..136f4ed --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/instruction.rs @@ -0,0 +1,30 @@ +use crate::parser::{syntax_kind::SyntaxKind::*, Parser}; + +use super::lit::literal; + +pub fn instr(p: &mut Parser) { + let instr = p.start(); + + instr_name(p); + instr_params(p); + + instr.complete(p, INSTR); +} + +fn instr_name(p: &mut Parser) { + let instr_name = p.start(); + + while p.at(IDENT) { + p.do_bump(); + } + + instr_name.complete(p, INSTR_NAME); +} + +fn instr_params(p: &mut Parser) { + if let Some(start) = literal(p) { + while literal(p).is_some() {} + + start.precede(p).complete(p, INSTR_PARAMS); + } +} diff --git a/crates/lang/src/parser/grammar/expression/lit.rs b/crates/lang/src/parser/grammar/expression/lit.rs new file mode 100644 index 0000000..bb48360 --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/lit.rs @@ -0,0 +1,20 @@ +use enumset::enum_set; + +use crate::parser::{ + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, +}; + +const LIT_TOKENS: TokenSet = enum_set!(INT_NUM | FLOAT_NUM | STRING); + +pub fn literal(p: &mut Parser) -> Option { + if !LIT_TOKENS.contains(p.current()) { + return None; + } + + let lit = p.start(); + + p.do_bump(); + + Some(lit.complete(p, LITERAL)) +} diff --git a/crates/lang/src/parser/input.rs b/crates/lang/src/parser/input.rs new file mode 100644 index 0000000..c61fc87 --- /dev/null +++ b/crates/lang/src/parser/input.rs @@ -0,0 +1,61 @@ +use crate::parser::syntax_kind::SyntaxKind; + +pub struct Input<'src, 'toks> { + raw: &'toks Vec<(SyntaxKind, &'src str)>, + /// indices of the "meaningful" tokens (not whitespace etc) + /// includes newlines because those might indeed help with finding errors + meaningful: Vec, + /// indices of newlines for the purpose of easily querying them + /// can be helpful with missing commas etc + newlines: Vec, +} + +impl<'src, 'toks> Input<'src, 'toks> { + pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { + let meaningful = raw_toks + .iter() + .enumerate() + .filter_map(|(i, tok)| match tok.0 { + SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE => None, + _ => Some(i), + }) + .collect(); + let newlines = raw_toks + .iter() + .enumerate() + .filter_map(|(i, tok)| match tok.0 { + SyntaxKind::NEWLINE => Some(i), + _ => None, + }) + .collect(); + + Self { + raw: raw_toks, + meaningful, + newlines, + } + } + + #[allow(clippy::unwrap_used, reason = "meaningful indices cannot be invalid")] + pub(crate) fn kind(&self, idx: usize) -> SyntaxKind { + let Some(meaningful_idx) = self.meaningful.get(idx) else { + return SyntaxKind::EOF; + }; + + self.raw.get(*meaningful_idx).unwrap().0 + } + + pub(crate) fn preceding_meaningless(&self, idx: usize) -> usize { + assert!(self.meaningful.len() > idx); + + if idx == 0 { + 1 + } else { + self.meaningful[idx] - self.meaningful[idx - 1] + } + } + + pub(crate) fn meaningless_tail_len(&self) -> usize { + self.raw.len() - (self.meaningful.last().unwrap() + 1) + } +} diff --git a/crates/lang/src/parser/output.rs b/crates/lang/src/parser/output.rs new file mode 100644 index 0000000..75019bb --- /dev/null +++ b/crates/lang/src/parser/output.rs @@ -0,0 +1,113 @@ +use rowan::{GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken}; +use std::mem; + +use crate::parser::syntax_kind::{Lang, SyntaxKind}; + +use super::{error::SyntaxError, events::Event}; + +pub struct Output { + pub green_node: GreenNode, + pub errors: Vec, +} +impl std::fmt::Debug for Output { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + debug_print_green_node(NodeOrToken::Node(&self.green_node), f, 0) + } +} + +fn debug_print_green_node( + node: NodeOrToken<&GreenNodeData, &GreenTokenData>, + f: &mut std::fmt::Formatter<'_>, + lvl: i32, +) -> std::fmt::Result { + for _ in 0..lvl { + f.write_str(" ")?; + } + + match node { + NodeOrToken::Node(n) => { + writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind()))?; + for c in n.children() { + debug_print_green_node(c, f, lvl + 1)?; + } + for _ in 0..lvl { + f.write_str(" ")?; + } + f.write_str("}\n") + } + NodeOrToken::Token(t) => { + writeln!(f, "{:?} {:?};", Lang::kind_from_raw(t.kind()), t.text()) + } + } +} + +impl Output { + pub fn from_parser_output( + mut raw_toks: Vec<(SyntaxKind, &str)>, + (mut events, errs): (Vec, Vec), + ) -> Self { + let mut builder = GreenNodeBuilder::new(); + let mut fw_parents = Vec::new(); + raw_toks.reverse(); + + for i in 0..events.len() { + match mem::replace(&mut events[i], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + if kind == SyntaxKind::TOMBSTONE && forward_parent.is_none() { + continue; + } + + fw_parents.push(kind); + let mut idx = i; + let mut fp = forward_parent; + while let Some(fwd) = fp { + idx += fwd as usize; + fp = match mem::replace(&mut events[idx], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + fw_parents.push(kind); + forward_parent + } + _ => unreachable!(), + } + } + + // remove whitespace bc it's ugly + while let Some((SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE, _)) = + raw_toks.last() + { + match events.iter_mut().find(|ev| matches!(ev, Event::Eat { .. })) { + Some(Event::Eat { count }) => *count -= 1, + _ => unreachable!(), + } + + let (tok, text): (SyntaxKind, &str) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + } + + for kind in fw_parents.drain(..).rev() { + if kind != SyntaxKind::TOMBSTONE { + builder.start_node(kind.into()); + } + } + } + Event::Finish => builder.finish_node(), + Event::Eat { count } => (0..count).for_each(|_| { + let (tok, text): (SyntaxKind, &str) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + }), + Event::Error => todo!(), + } + } + + Self { + green_node: builder.finish(), + errors: errs, + } + } +} diff --git a/crates/lang/src/parser/parser.rs b/crates/lang/src/parser/parser.rs new file mode 100644 index 0000000..9ee53da --- /dev/null +++ b/crates/lang/src/parser/parser.rs @@ -0,0 +1,6 @@ +//! The parser architecture is *heavily* inspired (and partially copied and adapted) from the amazing rust-analyzer +use drop_bomb::DropBomb; + +use self::{error::SyntaxError, events::Event, input::Input}; + +use super::syntax_kind::SyntaxKind; diff --git a/crates/lang/src/parser/ast/lossless/lex.rs b/crates/lang/src/parser/syntax_kind.rs similarity index 74% rename from crates/lang/src/parser/ast/lossless/lex.rs rename to crates/lang/src/parser/syntax_kind.rs index e2a867b..e37254f 100644 --- a/crates/lang/src/parser/ast/lossless/lex.rs +++ b/crates/lang/src/parser/syntax_kind.rs @@ -1,7 +1,6 @@ +use enumset::EnumSet; use logos::Logos; -use crate::parser::Span; - pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { let mut lex = SyntaxKind::lexer(src); let mut r = Vec::new(); @@ -13,8 +12,9 @@ pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { r } -#[derive(Logos, Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord)] +#[derive(enumset::EnumSetType, Logos, Debug, PartialEq, Eq, Clone, Copy, Hash, PartialOrd, Ord)] #[repr(u16)] +#[enumset(no_super_impls)] #[allow(non_camel_case_types)] pub enum SyntaxKind { #[token("def")] @@ -39,6 +39,7 @@ pub enum SyntaxKind { MAT_BODY, PARENTHESIZED_EXPR, EXPR, + LITERAL, #[token("(")] L_PAREN, #[token(")")] @@ -109,9 +110,29 @@ pub enum SyntaxKind { PARSE_ERR, LEX_ERR, ROOT, + EOF, + TOMBSTONE, + ERROR, } + +pub type TokenSet = EnumSet; + impl From for rowan::SyntaxKind { fn from(kind: SyntaxKind) -> Self { Self(kind as u16) } } + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Lang {} +impl rowan::Language for Lang { + type Kind = SyntaxKind; + #[allow(unsafe_code)] + fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind { + assert!(raw.0 <= SyntaxKind::ROOT as u16); + unsafe { std::mem::transmute::(raw.0) } + } + fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind { + kind.into() + } +} diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/parser/tests.rs index 5bd221f..8b13789 100644 --- a/crates/lang/src/parser/tests.rs +++ b/crates/lang/src/parser/tests.rs @@ -1,143 +1 @@ -use crate::parser::ast::File; -use crate::parser::parse; -use crate::tokens::Token; -use chumsky::input::Stream; -use chumsky::prelude::*; -use indexmap::IndexMap; -use logos::Logos; -// #[test] -// fn test_parse_node_with_params() { -// const INPUT: &str = "meow [ hello: $foo, world: @bar]"; -// assert_eq!( -// parse(INPUT).unwrap(), -// File { -// decls: IndexMap::from_iter([( -// ("main", (0..0).into()), -// ( -// Expr::Node( -// ("meow", (0..4).into()), -// Some(( -// IndexMap::from_iter([ -// ( -// ("hello", (7..12).into()), -// Expr::Var(("foo", (14..18).into())) -// ), -// ( -// ("world", (20..25).into()), -// Expr::InputVar(("bar", (27..31).into())) -// ) -// ]), -// (5..32).into() -// )) -// ), -// (0..32).into() -// ) -// )]) -// } -// ); -// } - -// fn test_parse_multiple_top_level_complex() { -// const INPUT: &str = r"def main = meow -// | uwu -// [ foo: @bar -// , hello: world @| test [ more: params ] | yay -// ] -// !| awa -// @| nya -// | rawr; - -// def test = meow -// [ hello: $foo -// , world: @bar -// ]; -// "; -// assert_eq!( -// parse(INPUT).unwrap(), -// File { -// decls: IndexMap::from_iter([ -// ( -// ("main", (4..8).into()), -// ( -// Expr::SimplePipe( -// Box::new(Expr::Node(("meow", (11..15).into()), None)), -// Box::new(Expr::NullPipe( -// Box::new(Expr::Node( -// ("uwu", (20..23).into()), -// Some(( -// IndexMap::from_iter([ -// ( -// ("foo", (29..32).into()), -// Expr::InputVar(("bar", (34..38).into())) -// ), -// ( -// ("hello", (44..49).into()), -// Expr::MappingPipe( -// Box::new(Expr::Node( -// ("world", (51..56).into()), -// None -// )), -// Box::new(Expr::SimplePipe( -// Box::new(Expr::Node( -// ("test", (60..64).into()), -// Some(( -// IndexMap::from_iter([( -// ("more", (67..71).into()), -// Expr::Node( -// ("params", (73..79).into()), -// None -// ) -// )]), -// (65..81).into() -// )) -// )), -// Box::new(Expr::Node( -// ("yay", (84..87).into()), -// None -// )) -// )) -// ) -// ) -// ]), -// (27..92).into() -// )) -// )), -// Box::new(Expr::MappingPipe( -// Box::new(Expr::Node(("awa", (97..100).into()), None)), -// Box::new(Expr::SimplePipe( -// Box::new(Expr::Node(("nya", (106..109).into()), None)), -// Box::new(Expr::Node(("rawr", (114..118).into()), None)) -// )) -// )) -// )) -// ), -// (11..118).into() -// ), -// ), -// ( -// ("test", (125..129).into()), -// ( -// Expr::Node( -// ("meow", (132..136).into()), -// Some(( -// IndexMap::from_iter([ -// ( -// ("hello", (141..146).into()), -// Expr::Var(("foo", (148..152).into())) -// ), -// ( -// ("world", (156..161).into()), -// Expr::InputVar(("bar", (163..167).into())) -// ) -// ]), -// (139..171).into() -// )) -// ), -// (132..171).into() -// ) -// ) -// ]) -// } -// ); -// } diff --git a/crates/lang/src/tokens.rs b/crates/lang/src/tokens.rs deleted file mode 100644 index 3314916..0000000 --- a/crates/lang/src/tokens.rs +++ /dev/null @@ -1,81 +0,0 @@ -use logos::Logos; - -#[derive(Logos, Debug, PartialEq, Eq, Clone)] -#[logos(skip r"[ \t\n\f]+")] -pub enum Token<'a> { - // hack! - // this isn't actually supposed to be in the language. - // i just can't figure out how to automatically choose between a top level declaration - // or a top level expression - // so a declaration needs the keyword def until i can figure this out - #[token("def")] - Def, - #[token("let")] - Let, - #[token("in")] - In, - #[token("mat")] - Mat, - #[regex("[\\d]+x[\\d]+", |lex| { - let (x, y) = lex.slice().split_once('x').expect("shouldn't fail to split"); - // TODO: handle overflows etc - (x.parse().expect("should only match valid u16s"), y.parse().expect("should only match valid u16s")) - })] - Dimensions((u16, u16)), - #[regex("[\\d]+", |lex| lex.slice())] - Int(&'a str), - #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)", |lex| lex.slice())] - Float(&'a str), - // TODO: more bigger better more complex string lexing - // TODO: templating? - #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#, |lex| lex.slice())] - String(&'a str), - #[token("+")] - Plus, - #[token("-")] - Minus, - #[token("*")] - Mult, - #[token("/")] - Div, - // TODO: figure out how to allow numbers in words? - #[regex("[a-zA-Z_]+[a-zA-Z_\\-\\d]*", |lex| lex.slice().trim())] - Word(&'a str), - #[regex("\\$[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] - VarIdent(&'a str), - #[regex("\\@[a-zA-Z0-9_\\-]+", |lex| &lex.slice()[1..])] - InputIdent(&'a str), - #[token(",")] - Comma, - #[token("|")] - Pipe, - #[token("@|")] - MappingPipe, - #[token("!|")] - NullPipe, - #[token("@")] - At, - #[token(">")] - GreaterThan, - #[token("=")] - Equals, - #[token(":")] - Colon, - #[token(";")] - Semicolon, - #[token("[")] - BracketOpen, - #[token("]")] - BracketClose, - #[token("(")] - ParenOpen, - #[token(")")] - ParenClose, - #[token("{")] - BraceOpen, - #[token("}")] - BraceClose, -} - -#[cfg(test)] -mod tests; diff --git a/crates/lang/src/tokens/tests.rs b/crates/lang/src/tokens/tests.rs deleted file mode 100644 index 3b35ace..0000000 --- a/crates/lang/src/tokens/tests.rs +++ /dev/null @@ -1,135 +0,0 @@ -use logos::Logos; - -use super::Token; - -/// generates tests for the lexer to avoid writing boilerplate -macro_rules! lexer_test { - ($name:ident, $input:literal, $out:expr) => { - #[test] - fn $name() { - let lex = Token::lexer($input); - let toks = lex.map(|tok| tok.unwrap()).collect::>(); - assert_eq!(toks, $out); - } - }; -} - -lexer_test! { - test_lex_simple_pipeline, - "streamer | processor | sink", - [ - Token::Word("streamer"), - Token::Pipe, - Token::Word("processor"), - Token::Pipe, - Token::Word("sink") - ] -} - -lexer_test! { - test_lex_var_ident, - "$identifier", - [ Token::VarIdent("identifier") ] -} - -lexer_test! { - test_lex_subgroup, - "subgroup(first, second) = a | b [ $first ] | c [ $second ]", - [ - Token::Word("subgroup"), - Token::ParenOpen, - Token::Word("first"), - Token::Comma, - Token::Word("second"), - Token::ParenClose, - Token::Equals, - Token::Word("a"), - Token::Pipe, - Token::Word("b"), - Token::BracketOpen, - Token::VarIdent("first"), - Token::BracketClose, - Token::Pipe, - Token::Word("c"), - Token::BracketOpen, - Token::VarIdent("second"), - Token::BracketClose - ] -} - -lexer_test! { - text_lex_crossing_pipeline_reordering, - "a >first, second|second, first> c", - [ - Token::Word("a"), - Token::GreaterThan, - Token::Word("first"), - Token::Comma, - Token::Word("second"), - Token::Pipe, - Token::Word("second"), - Token::Comma, - Token::Word("first"), - Token::GreaterThan, - Token::Word("c") - ] -} - -lexer_test! { - test_lex_crossing_input_args, - "a >second| c { second: @first }", - [ - Token::Word("a"), - Token::GreaterThan, - Token::Word("second"), - Token::Pipe, - Token::Word("c"), - Token::BraceOpen, - Token::Word("second"), - Token::Colon, - Token::InputIdent("first"), - Token::BraceClose - ] -} - -lexer_test! { - test_lex_map_io_named, - "a @| c", - [ - Token::Word("a"), - Token::MappingPipe, - Token::Word("c") - ] -} - -lexer_test! { - test_lex_int_literal, - "42", - [ - Token::Int("42") - ] -} - -lexer_test! { - test_lex_float_literal_0, - "1.5", - [ - Token::Float("1.5") - ] -} - -lexer_test! { - test_lex_float_literal_1, - "42.", - [ - Token::Float("42.") - ] -} - -lexer_test! { - test_lex_float_literal_2, - ".42", - [ - Token::Float(".42") - ] -} diff --git a/testfiles/test.owo b/testfiles/test.owo index dc95a8d..ab4456d 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,7 +1 @@ -hello world test - 42 - (another command 3.14 "meow") - "uwu" - { - some: attrs 42 (meow gay 1) - } +hello world test 1.5 42 69 "gay" From 06c9094227d477ea18556074ef37e6339e4c51c6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 11:09:48 +0200 Subject: [PATCH 118/189] lang: fix main --- crates/lang/src/main.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 6b1caa0..515cbe0 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,10 +1,7 @@ use clap::Parser; use std::{fs, path::PathBuf}; -use lang::parser::{ - parser::{self, grammar, input, output::Output}, - syntax_kind, -}; +use lang::parser::{self, grammar, input, output::Output, syntax_kind}; #[derive(Parser)] struct Args { From 86b1481943d8a0bb28374669a9e48e30d5eae1c7 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 11:15:07 +0200 Subject: [PATCH 119/189] lang: remove empty recursive parser module --- crates/lang/src/parser/parser.rs | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 crates/lang/src/parser/parser.rs diff --git a/crates/lang/src/parser/parser.rs b/crates/lang/src/parser/parser.rs deleted file mode 100644 index 9ee53da..0000000 --- a/crates/lang/src/parser/parser.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! The parser architecture is *heavily* inspired (and partially copied and adapted) from the amazing rust-analyzer -use drop_bomb::DropBomb; - -use self::{error::SyntaxError, events::Event, input::Input}; - -use super::syntax_kind::SyntaxKind; From 2bea3994c29c9802eef50b166963f4aad15a46a0 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 19:37:52 +0200 Subject: [PATCH 120/189] lang: matrix parser! --- crates/lang/src/parser.rs | 6 ++ crates/lang/src/parser/grammar/expression.rs | 58 ++++++++++++++-- .../grammar/expression/collection/matrix.rs | 69 +++++++++++++++++++ .../parser/grammar/expression/instruction.rs | 10 ++- crates/lang/src/parser/syntax_kind.rs | 8 ++- testfiles/test.owo | 5 +- 6 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 crates/lang/src/parser/grammar/expression/collection/matrix.rs diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index e850ab0..996f15a 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -94,6 +94,7 @@ impl Marker { bomb: DropBomb::new("Marker must be completed or abandoned"), } } + pub(crate) fn complete(mut self, p: &mut Parser<'_, '_>, kind: SyntaxKind) -> CompletedMarker { self.bomb.defuse(); match &mut p.events[self.pos] { @@ -108,6 +109,11 @@ impl Marker { } } + pub(crate) fn complete_err(mut self, p: &mut Parser, kind: SyntaxError) -> CompletedMarker { + p.errors.push(kind); + self.complete(p, SyntaxKind::PARSE_ERR) + } + pub(crate) fn abandon(mut self, p: &mut Parser<'_, '_>) { self.bomb.defuse(); if self.pos == p.events.len() - 1 { diff --git a/crates/lang/src/parser/grammar/expression.rs b/crates/lang/src/parser/grammar/expression.rs index 18323a5..cb1f410 100644 --- a/crates/lang/src/parser/grammar/expression.rs +++ b/crates/lang/src/parser/grammar/expression.rs @@ -1,14 +1,62 @@ -use crate::parser::{syntax_kind::SyntaxKind::*, Parser}; +use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; -use self::{instruction::instr, lit::literal}; +use self::{collection::collection, instruction::instr, lit::literal}; mod instruction; mod lit; +mod collection { + use enumset::enum_set; -pub fn expression(p: &mut Parser) { + use crate::parser::{ + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, + }; + + use self::{attr_set::attr_set, matrix::matrix, vec::vec}; + + const COLLECTION_START: TokenSet = enum_set!(MAT_KW | L_BRACK | L_BRACE); + + pub fn collection(p: &mut Parser) -> Option { + if !COLLECTION_START.contains(p.current()) { + return None; + } + + Some(match p.current() { + MAT_KW => matrix(p), + L_BRACK => vec(p), + L_BRACE => attr_set(p), + _ => unreachable!(), + }) + } + + mod matrix; + mod vec { + use crate::parser::{CompletedMarker, Parser}; + + pub fn vec(p: &mut Parser) -> CompletedMarker { + todo!() + } + } + mod attr_set { + use crate::parser::{CompletedMarker, Parser}; + + pub fn attr_set(p: &mut Parser) -> CompletedMarker { + todo!() + } + } +} + +pub fn expression(p: &mut Parser) -> Option { let expr = p.start(); - instr(p); + if atom(p).or_else(|| instr(p)).is_none() { + expr.abandon(p); + return None; + } - expr.complete(p, EXPR); + Some(expr.complete(p, EXPR)) +} + +pub fn atom(p: &mut Parser) -> Option { + literal(p).or_else(|| collection(p)) } diff --git a/crates/lang/src/parser/grammar/expression/collection/matrix.rs b/crates/lang/src/parser/grammar/expression/collection/matrix.rs new file mode 100644 index 0000000..58ba9e1 --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/collection/matrix.rs @@ -0,0 +1,69 @@ +use crate::parser::{ + error::SyntaxError, + grammar::expression::{self, expression}, + syntax_kind::SyntaxKind::*, + CompletedMarker, Marker, Parser, +}; + +pub fn matrix(p: &mut Parser) -> CompletedMarker { + let matrix = p.start(); + p.eat(MAT_KW); + + if !p.eat(PAT_DIMENSIONS) { + eprintln!("TODO (as eprintln so i dont forget): improve recovery algorithms"); + return matrix.complete_err(p, SyntaxError::Expected(vec![PAT_DIMENSIONS])); + } + + matrix_body(p); + + matrix.complete(p, MATRIX) +} + +fn matrix_body(p: &mut Parser) { + let mat_body = p.start(); + if !p.eat(L_BRACK) { + mat_body.complete_err(p, SyntaxError::Expected(vec![MAT_BODY])); + return (); + } + + let mut going = true; + + let mut mat_row = p.start(); + let mut row_items = 0; + while going { + let mat_item = p.start(); + if expression(p).is_some() { + mat_item.complete(p, MAT_ITEM); + row_items += 1; + match p.current() { + COMMA => p.do_bump(), + SEMICOLON => { + mat_row.complete(p, MAT_ROW); + mat_row = p.start(); + p.do_bump(); + row_items = 0; + } + R_BRACK => going = false, + _ => { + let err = p.start(); + p.do_bump(); + + err.complete_err(p, SyntaxError::Expected(vec![COMMA, SEMICOLON, R_BRACK])); + } + }; + } else if p.at(R_BRACK) { + going = false; + } else { + let err = p.start(); + p.do_bump(); + err.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])); + } + } + if row_items != 0 { + mat_row.complete(p, MAT_ROW); + } else { + mat_row.abandon(p); + } + p.eat(R_BRACK); + mat_body.complete(p, MAT_BODY); +} diff --git a/crates/lang/src/parser/grammar/expression/instruction.rs b/crates/lang/src/parser/grammar/expression/instruction.rs index 136f4ed..5da0f43 100644 --- a/crates/lang/src/parser/grammar/expression/instruction.rs +++ b/crates/lang/src/parser/grammar/expression/instruction.rs @@ -1,14 +1,18 @@ -use crate::parser::{syntax_kind::SyntaxKind::*, Parser}; +use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; use super::lit::literal; -pub fn instr(p: &mut Parser) { +pub fn instr(p: &mut Parser) -> Option { + if !p.at(IDENT) { + return None; + } + let instr = p.start(); instr_name(p); instr_params(p); - instr.complete(p, INSTR); + Some(instr.complete(p, INSTR)) } fn instr_name(p: &mut Parser) { diff --git a/crates/lang/src/parser/syntax_kind.rs b/crates/lang/src/parser/syntax_kind.rs index e37254f..cc1754c 100644 --- a/crates/lang/src/parser/syntax_kind.rs +++ b/crates/lang/src/parser/syntax_kind.rs @@ -34,9 +34,11 @@ pub enum SyntaxKind { #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)] STRING, MATRIX, + MAT_BODY, + MAT_ROW, + MAT_ITEM, DECL, LIST, - MAT_BODY, PARENTHESIZED_EXPR, EXPR, LITERAL, @@ -45,9 +47,9 @@ pub enum SyntaxKind { #[token(")")] R_PAREN, #[token("{")] - L_CURLY, + L_BRACE, #[token("}")] - R_CURLY, + R_BRACE, #[token("[")] L_BRACK, #[token("]")] diff --git a/testfiles/test.owo b/testfiles/test.owo index ab4456d..87a5bc8 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1,4 @@ -hello world test 1.5 42 69 "gay" +mat 2x2 [ + 1, 2; + 3, 4 +] From e62b50a51ae0d2b2e68a0a42d7ad8f3180c0b3e0 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 19:55:16 +0200 Subject: [PATCH 121/189] lang: make `Marker`s debuggable --- crates/lang/src/parser.rs | 10 +++++----- crates/lang/src/parser/grammar.rs | 2 +- crates/lang/src/parser/grammar/expression.rs | 2 +- .../parser/grammar/expression/collection/matrix.rs | 14 +++++++------- .../src/parser/grammar/expression/instruction.rs | 4 ++-- crates/lang/src/parser/grammar/expression/lit.rs | 2 +- testfiles/test.owo | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/crates/lang/src/parser.rs b/crates/lang/src/parser.rs index 996f15a..dfd80c5 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/parser.rs @@ -47,10 +47,10 @@ impl<'src, 'toks> Parser<'src, 'toks> { self.input.kind(self.pos) } - pub(crate) fn start(&mut self) -> Marker { + pub(crate) fn start(&mut self, name: &str) -> Marker { let pos = self.events.len(); self.push_ev(Event::tombstone()); - Marker::new(pos) + Marker::new(pos, name) } pub(crate) fn at(&self, kind: SyntaxKind) -> bool { @@ -88,10 +88,10 @@ pub(crate) struct Marker { } impl Marker { - pub(crate) fn new(pos: usize) -> Self { + pub(crate) fn new(pos: usize, name: &str) -> Self { Self { pos, - bomb: DropBomb::new("Marker must be completed or abandoned"), + bomb: DropBomb::new(format!("Marker {name} must be completed or abandoned")), } } @@ -135,7 +135,7 @@ pub(crate) struct CompletedMarker { impl CompletedMarker { pub(crate) fn precede(self, p: &mut Parser<'_, '_>) -> Marker { - let new_pos = p.start(); + let new_pos = p.start("new_pos"); match &mut p.events[self.pos] { Event::Start { forward_parent, .. } => { diff --git a/crates/lang/src/parser/grammar.rs b/crates/lang/src/parser/grammar.rs index f301d4e..75ed999 100644 --- a/crates/lang/src/parser/grammar.rs +++ b/crates/lang/src/parser/grammar.rs @@ -5,7 +5,7 @@ use super::Parser; mod expression; pub fn source_file(p: &mut Parser) { - let root = p.start(); + let root = p.start("root"); expression::expression(p); p.eat_succeeding_ws(); diff --git a/crates/lang/src/parser/grammar/expression.rs b/crates/lang/src/parser/grammar/expression.rs index cb1f410..3f3a43e 100644 --- a/crates/lang/src/parser/grammar/expression.rs +++ b/crates/lang/src/parser/grammar/expression.rs @@ -47,7 +47,7 @@ mod collection { } pub fn expression(p: &mut Parser) -> Option { - let expr = p.start(); + let expr = p.start("expr"); if atom(p).or_else(|| instr(p)).is_none() { expr.abandon(p); diff --git a/crates/lang/src/parser/grammar/expression/collection/matrix.rs b/crates/lang/src/parser/grammar/expression/collection/matrix.rs index 58ba9e1..2c572f5 100644 --- a/crates/lang/src/parser/grammar/expression/collection/matrix.rs +++ b/crates/lang/src/parser/grammar/expression/collection/matrix.rs @@ -6,7 +6,7 @@ use crate::parser::{ }; pub fn matrix(p: &mut Parser) -> CompletedMarker { - let matrix = p.start(); + let matrix = p.start("matrix"); p.eat(MAT_KW); if !p.eat(PAT_DIMENSIONS) { @@ -20,7 +20,7 @@ pub fn matrix(p: &mut Parser) -> CompletedMarker { } fn matrix_body(p: &mut Parser) { - let mat_body = p.start(); + let mat_body = p.start("mat_body"); if !p.eat(L_BRACK) { mat_body.complete_err(p, SyntaxError::Expected(vec![MAT_BODY])); return (); @@ -28,10 +28,10 @@ fn matrix_body(p: &mut Parser) { let mut going = true; - let mut mat_row = p.start(); + let mut mat_row = p.start("mat_row"); let mut row_items = 0; while going { - let mat_item = p.start(); + let mat_item = p.start("mat_item"); if expression(p).is_some() { mat_item.complete(p, MAT_ITEM); row_items += 1; @@ -39,13 +39,13 @@ fn matrix_body(p: &mut Parser) { COMMA => p.do_bump(), SEMICOLON => { mat_row.complete(p, MAT_ROW); - mat_row = p.start(); + mat_row = p.start("mat_row"); p.do_bump(); row_items = 0; } R_BRACK => going = false, _ => { - let err = p.start(); + let err = p.start("err"); p.do_bump(); err.complete_err(p, SyntaxError::Expected(vec![COMMA, SEMICOLON, R_BRACK])); @@ -54,7 +54,7 @@ fn matrix_body(p: &mut Parser) { } else if p.at(R_BRACK) { going = false; } else { - let err = p.start(); + let err = p.start("err"); p.do_bump(); err.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])); } diff --git a/crates/lang/src/parser/grammar/expression/instruction.rs b/crates/lang/src/parser/grammar/expression/instruction.rs index 5da0f43..5a12f4c 100644 --- a/crates/lang/src/parser/grammar/expression/instruction.rs +++ b/crates/lang/src/parser/grammar/expression/instruction.rs @@ -7,7 +7,7 @@ pub fn instr(p: &mut Parser) -> Option { return None; } - let instr = p.start(); + let instr = p.start("instr"); instr_name(p); instr_params(p); @@ -16,7 +16,7 @@ pub fn instr(p: &mut Parser) -> Option { } fn instr_name(p: &mut Parser) { - let instr_name = p.start(); + let instr_name = p.start("instr_name"); while p.at(IDENT) { p.do_bump(); diff --git a/crates/lang/src/parser/grammar/expression/lit.rs b/crates/lang/src/parser/grammar/expression/lit.rs index bb48360..afc1408 100644 --- a/crates/lang/src/parser/grammar/expression/lit.rs +++ b/crates/lang/src/parser/grammar/expression/lit.rs @@ -12,7 +12,7 @@ pub fn literal(p: &mut Parser) -> Option { return None; } - let lit = p.start(); + let lit = p.start("lit"); p.do_bump(); diff --git a/testfiles/test.owo b/testfiles/test.owo index 87a5bc8..4a3beda 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1,4 @@ mat 2x2 [ - 1, 2; + 1 2, 2; 3, 4 ] From 9510d9254cf4b9a4d57a2a12fa15dfdbee641bc7 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 19:55:25 +0200 Subject: [PATCH 122/189] lang: fix matrix recovery --- crates/lang/src/parser/grammar/expression/collection/matrix.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/lang/src/parser/grammar/expression/collection/matrix.rs b/crates/lang/src/parser/grammar/expression/collection/matrix.rs index 2c572f5..a8e21a1 100644 --- a/crates/lang/src/parser/grammar/expression/collection/matrix.rs +++ b/crates/lang/src/parser/grammar/expression/collection/matrix.rs @@ -52,8 +52,10 @@ fn matrix_body(p: &mut Parser) { } }; } else if p.at(R_BRACK) { + mat_item.abandon(p); going = false; } else { + mat_item.abandon(p); let err = p.start("err"); p.do_bump(); err.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])); From ba0da33509cc2e02b1685cf742e4da8cb9d02f88 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 20:00:17 +0200 Subject: [PATCH 123/189] split up files a bit --- crates/lang/src/parser/grammar/expression.rs | 42 +------------------ .../parser/grammar/expression/collection.rs | 27 ++++++++++++ .../grammar/expression/collection/attr_set.rs | 5 +++ .../grammar/expression/collection/vec.rs | 5 +++ 4 files changed, 38 insertions(+), 41 deletions(-) create mode 100644 crates/lang/src/parser/grammar/expression/collection.rs create mode 100644 crates/lang/src/parser/grammar/expression/collection/attr_set.rs create mode 100644 crates/lang/src/parser/grammar/expression/collection/vec.rs diff --git a/crates/lang/src/parser/grammar/expression.rs b/crates/lang/src/parser/grammar/expression.rs index 3f3a43e..2d3460c 100644 --- a/crates/lang/src/parser/grammar/expression.rs +++ b/crates/lang/src/parser/grammar/expression.rs @@ -2,49 +2,9 @@ use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; use self::{collection::collection, instruction::instr, lit::literal}; +mod collection; mod instruction; mod lit; -mod collection { - use enumset::enum_set; - - use crate::parser::{ - syntax_kind::{SyntaxKind::*, TokenSet}, - CompletedMarker, Parser, - }; - - use self::{attr_set::attr_set, matrix::matrix, vec::vec}; - - const COLLECTION_START: TokenSet = enum_set!(MAT_KW | L_BRACK | L_BRACE); - - pub fn collection(p: &mut Parser) -> Option { - if !COLLECTION_START.contains(p.current()) { - return None; - } - - Some(match p.current() { - MAT_KW => matrix(p), - L_BRACK => vec(p), - L_BRACE => attr_set(p), - _ => unreachable!(), - }) - } - - mod matrix; - mod vec { - use crate::parser::{CompletedMarker, Parser}; - - pub fn vec(p: &mut Parser) -> CompletedMarker { - todo!() - } - } - mod attr_set { - use crate::parser::{CompletedMarker, Parser}; - - pub fn attr_set(p: &mut Parser) -> CompletedMarker { - todo!() - } - } -} pub fn expression(p: &mut Parser) -> Option { let expr = p.start("expr"); diff --git a/crates/lang/src/parser/grammar/expression/collection.rs b/crates/lang/src/parser/grammar/expression/collection.rs new file mode 100644 index 0000000..0b525ad --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/collection.rs @@ -0,0 +1,27 @@ +use enumset::enum_set; + +use crate::parser::{ + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, +}; + +use self::{attr_set::attr_set, matrix::matrix, vec::vec}; + +mod attr_set; +mod matrix; +mod vec; + +const COLLECTION_START: TokenSet = enum_set!(MAT_KW | L_BRACK | L_BRACE); + +pub fn collection(p: &mut Parser) -> Option { + if !COLLECTION_START.contains(p.current()) { + return None; + } + + Some(match p.current() { + MAT_KW => matrix(p), + L_BRACK => vec(p), + L_BRACE => attr_set(p), + _ => unreachable!(), + }) +} diff --git a/crates/lang/src/parser/grammar/expression/collection/attr_set.rs b/crates/lang/src/parser/grammar/expression/collection/attr_set.rs new file mode 100644 index 0000000..a71ee7f --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/collection/attr_set.rs @@ -0,0 +1,5 @@ +use crate::parser::{CompletedMarker, Parser}; + +pub fn attr_set(p: &mut Parser) -> CompletedMarker { + todo!() +} diff --git a/crates/lang/src/parser/grammar/expression/collection/vec.rs b/crates/lang/src/parser/grammar/expression/collection/vec.rs new file mode 100644 index 0000000..76f3684 --- /dev/null +++ b/crates/lang/src/parser/grammar/expression/collection/vec.rs @@ -0,0 +1,5 @@ +use crate::parser::{CompletedMarker, Parser}; + +pub fn vec(p: &mut Parser) -> CompletedMarker { + todo!() +} From 4df0118aa4f7f78b935755649ce2fb4ec988e26b Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 24 Apr 2024 21:09:55 +0200 Subject: [PATCH 124/189] lang: first test and stuff --- Cargo.lock | 7 ++++ crates/lang/Cargo.toml | 1 + crates/lang/src/parser/grammar.rs | 22 ++++++++++- .../lang/src/parser/grammar/expression/lit.rs | 39 +++++++++++++++++++ testfiles/test.owo | 5 +-- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d759c0b..0252665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -504,6 +504,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + [[package]] name = "ir" version = "0.1.0" @@ -538,6 +544,7 @@ dependencies = [ "ego-tree", "enumset", "indexmap", + "indoc", "logos", "petgraph", "rowan", diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index fba2bcf..c64720c 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -15,6 +15,7 @@ ego-tree = "0.6.2" rowan = "0.15.15" drop_bomb = "0.1.5" enumset = "1.1.3" +indoc = "2" [lints] workspace = true diff --git a/crates/lang/src/parser/grammar.rs b/crates/lang/src/parser/grammar.rs index 75ed999..afcee25 100644 --- a/crates/lang/src/parser/grammar.rs +++ b/crates/lang/src/parser/grammar.rs @@ -1,6 +1,13 @@ +use std::fmt::Debug; + use crate::parser::syntax_kind::SyntaxKind::*; -use super::Parser; +use super::{ + input::Input, + output::Output, + syntax_kind::{self, lex}, + Parser, +}; mod expression; @@ -12,3 +19,16 @@ pub fn source_file(p: &mut Parser) { root.complete(p, ROOT); } + +fn check_parser(input: &str, parser_fn: fn(&mut Parser), output: &str) { + let toks = lex(input); + let mut parser = Parser::new(Input::new(&toks)); + + parser_fn(&mut parser); + + let p_out = dbg!(parser.finish()); + let o = Output::from_parser_output(toks, p_out); + + let s = format!("{o:?}"); + assert_eq!(&s, output); +} diff --git a/crates/lang/src/parser/grammar/expression/lit.rs b/crates/lang/src/parser/grammar/expression/lit.rs index afc1408..4917c88 100644 --- a/crates/lang/src/parser/grammar/expression/lit.rs +++ b/crates/lang/src/parser/grammar/expression/lit.rs @@ -1,6 +1,8 @@ use enumset::enum_set; +use indoc::indoc; use crate::parser::{ + grammar::check_parser, syntax_kind::{SyntaxKind::*, TokenSet}, CompletedMarker, Parser, }; @@ -18,3 +20,40 @@ pub fn literal(p: &mut Parser) -> Option { Some(lit.complete(p, LITERAL)) } + +#[test] +fn test_parse_lst_lit() { + check_parser( + "42", + |p| { + literal(p); + }, + indoc! {r#" + LITERAL { + INT_NUM "42"; + } + "#}, + ); + check_parser( + "3.14", + |p| { + literal(p); + }, + indoc! {r#" + LITERAL { + FLOAT_NUM "3.14"; + } + "#}, + ); + check_parser( + r#""Meow""#, + |p| { + literal(p); + }, + indoc! {r#" + LITERAL { + STRING "\"Meow\""; + } + "#}, + ); +} diff --git a/testfiles/test.owo b/testfiles/test.owo index 4a3beda..d81cc07 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1 @@ -mat 2x2 [ - 1 2, 2; - 3, 4 -] +42 From 8a541546d9ddac4fa95aca958d58a2835deb69e5 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 28 Apr 2024 13:22:04 +0200 Subject: [PATCH 125/189] app: fix error_reporting not being used --- crates/app/src/config/config_file.rs | 18 +++++++++++++----- crates/app/src/error_reporting.rs | 2 +- testfiles/config.json | 4 ++++ testfiles/config.ron | 4 ++++ testfiles/test.owo | 5 ++++- 5 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 testfiles/config.json create mode 100644 testfiles/config.ron diff --git a/crates/app/src/config/config_file.rs b/crates/app/src/config/config_file.rs index 15f660c..7078d32 100644 --- a/crates/app/src/config/config_file.rs +++ b/crates/app/src/config/config_file.rs @@ -5,7 +5,9 @@ use std::{ use serde::{Deserialize, Serialize}; -use super::error::Config; +use crate::error_reporting::{report_serde_json_err, report_serde_ron_err}; + +use super::error::{self, Config}; #[derive(Debug, Serialize, Deserialize)] pub struct Configs { @@ -40,14 +42,20 @@ pub(super) fn find_config_file() -> Result { } impl Configs { - pub fn read(p: PathBuf) -> Result { + pub fn read(p: PathBuf) -> Result { match p .extension() .map(|v| v.to_str().expect("config path to be UTF-8")) { - Some("ron") => Ok(serde_json::from_str(&fs::read_to_string(p)?)?), - Some("json") => Ok(ron::from_str(&fs::read_to_string(p)?)?), - e => Err(Config::UnknownExtension(e.map(str::to_owned))), + Some("ron") => { + let f = fs::read_to_string(p)?; + ron::from_str(&f).or_else(|e| report_serde_ron_err(&f, &e)) + } + Some("json") => { + let f = fs::read_to_string(p)?; + serde_json::from_str(&f).or_else(|e| report_serde_json_err(&f, &e)) + } + e => Err(error::Config::UnknownExtension(e.map(str::to_owned))), } } } diff --git a/crates/app/src/error_reporting.rs b/crates/app/src/error_reporting.rs index bc4c44b..3981b17 100644 --- a/crates/app/src/error_reporting.rs +++ b/crates/app/src/error_reporting.rs @@ -25,7 +25,7 @@ fn report_serde_err(src: &str, line: usize, col: usize, msg: String) -> ! { .finish() .eprint(("test", Source::from(src))) .expect("writing error to stderr failed"); - process::exit(1); + process::exit(1) } /// Reconstruct a byte offset from the line + column numbers typical from serde crates diff --git a/testfiles/config.json b/testfiles/config.json new file mode 100644 index 0000000..3456c5c --- /dev/null +++ b/testfiles/config.json @@ -0,0 +1,4 @@ +{ + "example_value": "42", + "no_startup_message": true +} \ No newline at end of file diff --git a/testfiles/config.ron b/testfiles/config.ron new file mode 100644 index 0000000..7b47189 --- /dev/null +++ b/testfiles/config.ron @@ -0,0 +1,4 @@ +( + example_value: 42 + no_startup_message: false, +) diff --git a/testfiles/test.owo b/testfiles/test.owo index d81cc07..51f07d1 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1,4 @@ -42 +generator | { + foo, + bar +} | From 9af71ed3f4ad04cf5d31bc195b7abd12b5a61872 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 30 Apr 2024 09:45:36 +0200 Subject: [PATCH 126/189] lang: implement vec, list and matrix --- .../parser/grammar/expression/collection.rs | 8 +-- .../grammar/expression/collection/matrix.rs | 71 ------------------- .../grammar/expression/collection/vec.rs | 71 ++++++++++++++++++- .../parser/grammar/expression/instruction.rs | 6 +- crates/lang/src/parser/syntax_kind.rs | 11 ++- 5 files changed, 78 insertions(+), 89 deletions(-) delete mode 100644 crates/lang/src/parser/grammar/expression/collection/matrix.rs diff --git a/crates/lang/src/parser/grammar/expression/collection.rs b/crates/lang/src/parser/grammar/expression/collection.rs index 0b525ad..e72cb6c 100644 --- a/crates/lang/src/parser/grammar/expression/collection.rs +++ b/crates/lang/src/parser/grammar/expression/collection.rs @@ -5,13 +5,12 @@ use crate::parser::{ CompletedMarker, Parser, }; -use self::{attr_set::attr_set, matrix::matrix, vec::vec}; +use self::{attr_set::attr_set, vec::vec_matrix_list}; mod attr_set; -mod matrix; mod vec; -const COLLECTION_START: TokenSet = enum_set!(MAT_KW | L_BRACK | L_BRACE); +const COLLECTION_START: TokenSet = enum_set!(L_BRACK | L_BRACE); pub fn collection(p: &mut Parser) -> Option { if !COLLECTION_START.contains(p.current()) { @@ -19,8 +18,7 @@ pub fn collection(p: &mut Parser) -> Option { } Some(match p.current() { - MAT_KW => matrix(p), - L_BRACK => vec(p), + L_BRACK => vec_matrix_list(p), L_BRACE => attr_set(p), _ => unreachable!(), }) diff --git a/crates/lang/src/parser/grammar/expression/collection/matrix.rs b/crates/lang/src/parser/grammar/expression/collection/matrix.rs deleted file mode 100644 index a8e21a1..0000000 --- a/crates/lang/src/parser/grammar/expression/collection/matrix.rs +++ /dev/null @@ -1,71 +0,0 @@ -use crate::parser::{ - error::SyntaxError, - grammar::expression::{self, expression}, - syntax_kind::SyntaxKind::*, - CompletedMarker, Marker, Parser, -}; - -pub fn matrix(p: &mut Parser) -> CompletedMarker { - let matrix = p.start("matrix"); - p.eat(MAT_KW); - - if !p.eat(PAT_DIMENSIONS) { - eprintln!("TODO (as eprintln so i dont forget): improve recovery algorithms"); - return matrix.complete_err(p, SyntaxError::Expected(vec![PAT_DIMENSIONS])); - } - - matrix_body(p); - - matrix.complete(p, MATRIX) -} - -fn matrix_body(p: &mut Parser) { - let mat_body = p.start("mat_body"); - if !p.eat(L_BRACK) { - mat_body.complete_err(p, SyntaxError::Expected(vec![MAT_BODY])); - return (); - } - - let mut going = true; - - let mut mat_row = p.start("mat_row"); - let mut row_items = 0; - while going { - let mat_item = p.start("mat_item"); - if expression(p).is_some() { - mat_item.complete(p, MAT_ITEM); - row_items += 1; - match p.current() { - COMMA => p.do_bump(), - SEMICOLON => { - mat_row.complete(p, MAT_ROW); - mat_row = p.start("mat_row"); - p.do_bump(); - row_items = 0; - } - R_BRACK => going = false, - _ => { - let err = p.start("err"); - p.do_bump(); - - err.complete_err(p, SyntaxError::Expected(vec![COMMA, SEMICOLON, R_BRACK])); - } - }; - } else if p.at(R_BRACK) { - mat_item.abandon(p); - going = false; - } else { - mat_item.abandon(p); - let err = p.start("err"); - p.do_bump(); - err.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])); - } - } - if row_items != 0 { - mat_row.complete(p, MAT_ROW); - } else { - mat_row.abandon(p); - } - p.eat(R_BRACK); - mat_body.complete(p, MAT_BODY); -} diff --git a/crates/lang/src/parser/grammar/expression/collection/vec.rs b/crates/lang/src/parser/grammar/expression/collection/vec.rs index 76f3684..eff741a 100644 --- a/crates/lang/src/parser/grammar/expression/collection/vec.rs +++ b/crates/lang/src/parser/grammar/expression/collection/vec.rs @@ -1,5 +1,70 @@ -use crate::parser::{CompletedMarker, Parser}; +use crate::parser::{ + error::SyntaxError, grammar::expression::atom, CompletedMarker, Marker, Parser, SyntaxKind::*, +}; -pub fn vec(p: &mut Parser) -> CompletedMarker { - todo!() +pub fn vec_matrix_list(p: &mut Parser) -> CompletedMarker { + let start = p.start("vec_matrix_list_start"); + assert!(p.eat(L_BRACK)); + let row_start = p.start("matrix_row_start"); + if let Some(item) = atom(p) { + item.precede(p).complete(p, COLLECTION_ITEM); + + if p.at(COMMA) { + row_start.abandon(p); + return finish_list(p, start); + } + + finish_mat_or_vec(p, start, row_start) + } else if p.eat(R_BRACK) { + start.complete(p, LIST) + } else { + start.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])) + } +} + +// TODO: handle semicolons, other wrong toks +fn finish_list(p: &mut Parser, list_start: Marker) -> CompletedMarker { + loop { + if p.eat(COMMA) { + if let Some(item) = atom(p) { + item.precede(p).complete(p, COLLECTION_ITEM); + } else if p.eat(R_BRACK) { + return list_start.complete(p, LIST); + } + } else if p.eat(R_BRACK) { + return list_start.complete(p, LIST); + } + } +} + +// TODO: handle commas, general other wrong toks +fn finish_mat_or_vec(p: &mut Parser, coll_start: Marker, mut row_start: Marker) -> CompletedMarker { + let mut is_matrix = false; + let mut row_item_count = 1; + loop { + if let Some(item) = atom(p) { + item.precede(p).complete(p, COLLECTION_ITEM); + row_item_count += 1; + } else if p.at(SEMICOLON) { + is_matrix = true; + row_start.complete(p, MAT_ROW); + p.eat(SEMICOLON); + row_start = p.start("matrix_row_start"); + row_item_count = 0; + } else if p.at(R_BRACK) { + if is_matrix && row_item_count == 0 { + row_start.abandon(p); + p.eat(R_BRACK); + return coll_start.complete(p, MATRIX); + } else if is_matrix { + row_start.complete(p, MAT_ROW); + p.eat(R_BRACK); + return coll_start.complete(p, MATRIX); + } else { + row_start.abandon(p); + p.eat(R_BRACK); + return coll_start.complete(p, VEC); + } + } + } } diff --git a/crates/lang/src/parser/grammar/expression/instruction.rs b/crates/lang/src/parser/grammar/expression/instruction.rs index 5a12f4c..832d2ab 100644 --- a/crates/lang/src/parser/grammar/expression/instruction.rs +++ b/crates/lang/src/parser/grammar/expression/instruction.rs @@ -1,6 +1,6 @@ use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; -use super::lit::literal; +use super::{atom, lit::literal}; pub fn instr(p: &mut Parser) -> Option { if !p.at(IDENT) { @@ -26,8 +26,8 @@ fn instr_name(p: &mut Parser) { } fn instr_params(p: &mut Parser) { - if let Some(start) = literal(p) { - while literal(p).is_some() {} + if let Some(start) = atom(p) { + while atom(p).is_some() {} start.precede(p).complete(p, INSTR_PARAMS); } diff --git a/crates/lang/src/parser/syntax_kind.rs b/crates/lang/src/parser/syntax_kind.rs index cc1754c..0447a90 100644 --- a/crates/lang/src/parser/syntax_kind.rs +++ b/crates/lang/src/parser/syntax_kind.rs @@ -23,10 +23,6 @@ pub enum SyntaxKind { LET_KW, #[token("in")] IN_KW, - #[token("mat")] - MAT_KW, - #[regex("[\\d]+x[\\d]+")] - PAT_DIMENSIONS, #[regex("[\\d]+")] INT_NUM, #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")] @@ -34,11 +30,12 @@ pub enum SyntaxKind { #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)] STRING, MATRIX, - MAT_BODY, MAT_ROW, - MAT_ITEM, - DECL, + VEC, LIST, + // either of a vec, a matrix or a list + COLLECTION_ITEM, + DECL, PARENTHESIZED_EXPR, EXPR, LITERAL, From db2643359c950614602cc85286550b925597f319 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 30 Apr 2024 10:18:59 +0200 Subject: [PATCH 127/189] lang: basic attrset parser --- .../grammar/expression/collection/attr_set.rs | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/crates/lang/src/parser/grammar/expression/collection/attr_set.rs b/crates/lang/src/parser/grammar/expression/collection/attr_set.rs index a71ee7f..2ef90b5 100644 --- a/crates/lang/src/parser/grammar/expression/collection/attr_set.rs +++ b/crates/lang/src/parser/grammar/expression/collection/attr_set.rs @@ -1,5 +1,45 @@ -use crate::parser::{CompletedMarker, Parser}; +use crate::parser::{ + error::SyntaxError, + grammar::expression::{atom, expression}, + CompletedMarker, Marker, Parser, + SyntaxKind::*, +}; pub fn attr_set(p: &mut Parser) -> CompletedMarker { - todo!() + let start = p.start("attr_set_start"); + assert!(p.eat(L_BRACE)); + + loop { + if attr(p).is_some() { + // TODO: handle others + if p.eat(COMMA) { + continue; + } else if p.eat(R_BRACE) { + return start.complete(p, ATTR_SET); + } + // TODO: check for newline and stuff following that for recov of others + } else if p.eat(R_BRACE) { + return start.complete(p, ATTR_SET); + } + } +} + +fn attr(p: &mut Parser) -> Option { + if p.at(IDENT) { + let attr_start = p.start("attr"); + let attr_name_start = p.start("attr_name"); + p.do_bump(); + attr_name_start.complete(p, ATTR_NAME); + + // TODO: handle comma, expr/atom, other + p.eat(COLON); + + // TODO: handle failed expr parser too + let attr_value = p.start("attr_value"); + let _ = expression(p); + attr_value.complete(p, ATTR_VALUE); + Some(attr_start.complete(p, ATTR)) + } else { + None + } } From 30f17773a84d0e1202329721e52c82a629cc0e54 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 30 Apr 2024 12:21:06 +0200 Subject: [PATCH 128/189] lang: add pipelines and rename parser to lst_parser --- crates/lang/src/lib.rs | 2 +- crates/lang/src/{parser.rs => lst_parser.rs} | 4 +- .../lang/src/{parser => lst_parser}/error.rs | 3 +- .../lang/src/{parser => lst_parser}/events.rs | 2 +- .../src/{parser => lst_parser}/grammar.rs | 4 +- .../lang/src/lst_parser/grammar/expression.rs | 81 +++++++++++++++++++ .../grammar/expression/collection.rs | 2 +- .../grammar/expression/collection/attr_set.rs | 4 +- .../grammar/expression/collection/vec.rs | 11 ++- .../grammar/expression/instruction.rs | 4 +- .../grammar/expression/lit.rs | 2 +- .../lang/src/{parser => lst_parser}/input.rs | 2 +- .../lang/src/{parser => lst_parser}/output.rs | 2 +- .../src/{parser => lst_parser}/syntax_kind.rs | 1 + .../lang/src/{parser => lst_parser}/tests.rs | 0 crates/lang/src/main.rs | 4 +- crates/lang/src/parser/grammar/expression.rs | 22 ----- testfiles/test.owo | 5 +- 18 files changed, 108 insertions(+), 47 deletions(-) rename crates/lang/src/{parser.rs => lst_parser.rs} (96%) rename crates/lang/src/{parser => lst_parser}/error.rs (51%) rename crates/lang/src/{parser => lst_parser}/events.rs (88%) rename crates/lang/src/{parser => lst_parser}/grammar.rs (87%) create mode 100644 crates/lang/src/lst_parser/grammar/expression.rs rename crates/lang/src/{parser => lst_parser}/grammar/expression/collection.rs (95%) rename crates/lang/src/{parser => lst_parser}/grammar/expression/collection/attr_set.rs (95%) rename crates/lang/src/{parser => lst_parser}/grammar/expression/collection/vec.rs (87%) rename crates/lang/src/{parser => lst_parser}/grammar/expression/instruction.rs (78%) rename crates/lang/src/{parser => lst_parser}/grammar/expression/lit.rs (97%) rename crates/lang/src/{parser => lst_parser}/input.rs (97%) rename crates/lang/src/{parser => lst_parser}/output.rs (98%) rename crates/lang/src/{parser => lst_parser}/syntax_kind.rs (99%) rename crates/lang/src/{parser => lst_parser}/tests.rs (100%) delete mode 100644 crates/lang/src/parser/grammar/expression.rs diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index 1b08789..e552496 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,2 +1,2 @@ #![feature(type_alias_impl_trait, lint_reasons)] -pub mod parser; +pub mod lst_parser; diff --git a/crates/lang/src/parser.rs b/crates/lang/src/lst_parser.rs similarity index 96% rename from crates/lang/src/parser.rs rename to crates/lang/src/lst_parser.rs index dfd80c5..9b93010 100644 --- a/crates/lang/src/parser.rs +++ b/crates/lang/src/lst_parser.rs @@ -134,8 +134,8 @@ pub(crate) struct CompletedMarker { } impl CompletedMarker { - pub(crate) fn precede(self, p: &mut Parser<'_, '_>) -> Marker { - let new_pos = p.start("new_pos"); + pub(crate) fn precede(self, p: &mut Parser<'_, '_>, name: &str) -> Marker { + let new_pos = p.start(name); match &mut p.events[self.pos] { Event::Start { forward_parent, .. } => { diff --git a/crates/lang/src/parser/error.rs b/crates/lang/src/lst_parser/error.rs similarity index 51% rename from crates/lang/src/parser/error.rs rename to crates/lang/src/lst_parser/error.rs index 698ecaf..d13306c 100644 --- a/crates/lang/src/parser/error.rs +++ b/crates/lang/src/lst_parser/error.rs @@ -1,6 +1,7 @@ -use crate::parser::syntax_kind::SyntaxKind; +use crate::lst_parser::syntax_kind::SyntaxKind; #[derive(Debug)] pub enum SyntaxError { Expected(Vec), + PipelineNeedsSink, } diff --git a/crates/lang/src/parser/events.rs b/crates/lang/src/lst_parser/events.rs similarity index 88% rename from crates/lang/src/parser/events.rs rename to crates/lang/src/lst_parser/events.rs index 6fc5b2c..00d7524 100644 --- a/crates/lang/src/parser/events.rs +++ b/crates/lang/src/lst_parser/events.rs @@ -1,4 +1,4 @@ -use crate::parser::syntax_kind::SyntaxKind; +use crate::lst_parser::syntax_kind::SyntaxKind; #[derive(Debug)] pub enum Event { diff --git a/crates/lang/src/parser/grammar.rs b/crates/lang/src/lst_parser/grammar.rs similarity index 87% rename from crates/lang/src/parser/grammar.rs rename to crates/lang/src/lst_parser/grammar.rs index afcee25..9d081bb 100644 --- a/crates/lang/src/parser/grammar.rs +++ b/crates/lang/src/lst_parser/grammar.rs @@ -1,6 +1,6 @@ use std::fmt::Debug; -use crate::parser::syntax_kind::SyntaxKind::*; +use crate::lst_parser::syntax_kind::SyntaxKind::*; use super::{ input::Input, @@ -14,7 +14,7 @@ mod expression; pub fn source_file(p: &mut Parser) { let root = p.start("root"); - expression::expression(p); + expression::expression(p, false); p.eat_succeeding_ws(); root.complete(p, ROOT); diff --git a/crates/lang/src/lst_parser/grammar/expression.rs b/crates/lang/src/lst_parser/grammar/expression.rs new file mode 100644 index 0000000..6ad7235 --- /dev/null +++ b/crates/lang/src/lst_parser/grammar/expression.rs @@ -0,0 +1,81 @@ +use crate::lst_parser::{error::SyntaxError, syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; + +use self::{collection::collection, instruction::instr, lit::literal, pipeline::PIPES}; + +mod collection; +mod instruction; +mod lit; +mod pipeline { + use enumset::enum_set; + + use crate::lst_parser::{ + error::SyntaxError, + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, + }; + + use super::expression; + + pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option { + if !pipe(p) { + return Some(start_expr); + } + let pipeline_marker = start_expr.precede(p, "pipeline_start"); + + loop { + if expression(p, true).is_none() { + return Some(pipeline_marker.complete_err(p, SyntaxError::PipelineNeedsSink)); + } + if !pipe(p) { + return Some(pipeline_marker.complete(p, PIPELINE)); + } + } + } + + pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE); + + fn pipe(p: &mut Parser) -> bool { + if PIPES.contains(p.current()) { + p.do_bump(); + true + } else { + false + } + } +} + +pub fn expression(p: &mut Parser, in_pipe: bool) -> Option { + let expr = p.start("expr"); + + if atom(p).or_else(|| instr(p)).is_none() { + expr.abandon(p); + return None; + } + + let r = expr.complete(p, EXPR); + + if PIPES.contains(p.current()) && !in_pipe { + pipeline::pipeline(p, r) + } else { + Some(r) + } +} + +pub fn atom(p: &mut Parser) -> Option { + literal(p) + .or_else(|| collection(p)) + .or_else(|| parenthesized_expr(p)) +} + +pub fn parenthesized_expr(p: &mut Parser) -> Option { + if p.eat(L_PAREN) { + let par_expr = p.start("parenthesized"); + expression(p, false); + if !p.eat(R_PAREN) { + return Some(par_expr.complete_err(p, SyntaxError::Expected(vec![R_PAREN]))); + } + + return Some(par_expr.complete(p, PARENTHESIZED_EXPR)); + } + None +} diff --git a/crates/lang/src/parser/grammar/expression/collection.rs b/crates/lang/src/lst_parser/grammar/expression/collection.rs similarity index 95% rename from crates/lang/src/parser/grammar/expression/collection.rs rename to crates/lang/src/lst_parser/grammar/expression/collection.rs index e72cb6c..8535291 100644 --- a/crates/lang/src/parser/grammar/expression/collection.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection.rs @@ -1,6 +1,6 @@ use enumset::enum_set; -use crate::parser::{ +use crate::lst_parser::{ syntax_kind::{SyntaxKind::*, TokenSet}, CompletedMarker, Parser, }; diff --git a/crates/lang/src/parser/grammar/expression/collection/attr_set.rs b/crates/lang/src/lst_parser/grammar/expression/collection/attr_set.rs similarity index 95% rename from crates/lang/src/parser/grammar/expression/collection/attr_set.rs rename to crates/lang/src/lst_parser/grammar/expression/collection/attr_set.rs index 2ef90b5..b5a73fa 100644 --- a/crates/lang/src/parser/grammar/expression/collection/attr_set.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection/attr_set.rs @@ -1,4 +1,4 @@ -use crate::parser::{ +use crate::lst_parser::{ error::SyntaxError, grammar::expression::{atom, expression}, CompletedMarker, Marker, Parser, @@ -36,7 +36,7 @@ fn attr(p: &mut Parser) -> Option { // TODO: handle failed expr parser too let attr_value = p.start("attr_value"); - let _ = expression(p); + let _ = expression(p, false); attr_value.complete(p, ATTR_VALUE); Some(attr_start.complete(p, ATTR)) } else { diff --git a/crates/lang/src/parser/grammar/expression/collection/vec.rs b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs similarity index 87% rename from crates/lang/src/parser/grammar/expression/collection/vec.rs rename to crates/lang/src/lst_parser/grammar/expression/collection/vec.rs index eff741a..fa76058 100644 --- a/crates/lang/src/parser/grammar/expression/collection/vec.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs @@ -1,4 +1,4 @@ -use crate::parser::{ +use crate::lst_parser::{ error::SyntaxError, grammar::expression::atom, CompletedMarker, Marker, Parser, SyntaxKind::*, }; @@ -7,7 +7,8 @@ pub fn vec_matrix_list(p: &mut Parser) -> CompletedMarker { assert!(p.eat(L_BRACK)); let row_start = p.start("matrix_row_start"); if let Some(item) = atom(p) { - item.precede(p).complete(p, COLLECTION_ITEM); + item.precede(p, "coll_item_start") + .complete(p, COLLECTION_ITEM); if p.at(COMMA) { row_start.abandon(p); @@ -27,7 +28,8 @@ fn finish_list(p: &mut Parser, list_start: Marker) -> CompletedMarker { loop { if p.eat(COMMA) { if let Some(item) = atom(p) { - item.precede(p).complete(p, COLLECTION_ITEM); + item.precede(p, "coll_item_start") + .complete(p, COLLECTION_ITEM); } else if p.eat(R_BRACK) { return list_start.complete(p, LIST); } @@ -43,7 +45,8 @@ fn finish_mat_or_vec(p: &mut Parser, coll_start: Marker, mut row_start: Marker) let mut row_item_count = 1; loop { if let Some(item) = atom(p) { - item.precede(p).complete(p, COLLECTION_ITEM); + item.precede(p, "coll_item_start") + .complete(p, COLLECTION_ITEM); row_item_count += 1; } else if p.at(SEMICOLON) { is_matrix = true; diff --git a/crates/lang/src/parser/grammar/expression/instruction.rs b/crates/lang/src/lst_parser/grammar/expression/instruction.rs similarity index 78% rename from crates/lang/src/parser/grammar/expression/instruction.rs rename to crates/lang/src/lst_parser/grammar/expression/instruction.rs index 832d2ab..bbe0ed3 100644 --- a/crates/lang/src/parser/grammar/expression/instruction.rs +++ b/crates/lang/src/lst_parser/grammar/expression/instruction.rs @@ -1,4 +1,4 @@ -use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; +use crate::lst_parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; use super::{atom, lit::literal}; @@ -29,6 +29,6 @@ fn instr_params(p: &mut Parser) { if let Some(start) = atom(p) { while atom(p).is_some() {} - start.precede(p).complete(p, INSTR_PARAMS); + start.precede(p, "params_start").complete(p, INSTR_PARAMS); } } diff --git a/crates/lang/src/parser/grammar/expression/lit.rs b/crates/lang/src/lst_parser/grammar/expression/lit.rs similarity index 97% rename from crates/lang/src/parser/grammar/expression/lit.rs rename to crates/lang/src/lst_parser/grammar/expression/lit.rs index 4917c88..8a18a04 100644 --- a/crates/lang/src/parser/grammar/expression/lit.rs +++ b/crates/lang/src/lst_parser/grammar/expression/lit.rs @@ -1,7 +1,7 @@ use enumset::enum_set; use indoc::indoc; -use crate::parser::{ +use crate::lst_parser::{ grammar::check_parser, syntax_kind::{SyntaxKind::*, TokenSet}, CompletedMarker, Parser, diff --git a/crates/lang/src/parser/input.rs b/crates/lang/src/lst_parser/input.rs similarity index 97% rename from crates/lang/src/parser/input.rs rename to crates/lang/src/lst_parser/input.rs index c61fc87..e9a5e2e 100644 --- a/crates/lang/src/parser/input.rs +++ b/crates/lang/src/lst_parser/input.rs @@ -1,4 +1,4 @@ -use crate::parser::syntax_kind::SyntaxKind; +use crate::lst_parser::syntax_kind::SyntaxKind; pub struct Input<'src, 'toks> { raw: &'toks Vec<(SyntaxKind, &'src str)>, diff --git a/crates/lang/src/parser/output.rs b/crates/lang/src/lst_parser/output.rs similarity index 98% rename from crates/lang/src/parser/output.rs rename to crates/lang/src/lst_parser/output.rs index 75019bb..b530ac3 100644 --- a/crates/lang/src/parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -1,7 +1,7 @@ use rowan::{GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken}; use std::mem; -use crate::parser::syntax_kind::{Lang, SyntaxKind}; +use crate::lst_parser::syntax_kind::{Lang, SyntaxKind}; use super::{error::SyntaxError, events::Event}; diff --git a/crates/lang/src/parser/syntax_kind.rs b/crates/lang/src/lst_parser/syntax_kind.rs similarity index 99% rename from crates/lang/src/parser/syntax_kind.rs rename to crates/lang/src/lst_parser/syntax_kind.rs index 0447a90..3d817e3 100644 --- a/crates/lang/src/parser/syntax_kind.rs +++ b/crates/lang/src/lst_parser/syntax_kind.rs @@ -92,6 +92,7 @@ pub enum SyntaxKind { MAPPING_PIPE, #[token("!|")] NULL_PIPE, + PIPELINE, #[token("=")] EQ, #[token(":")] diff --git a/crates/lang/src/parser/tests.rs b/crates/lang/src/lst_parser/tests.rs similarity index 100% rename from crates/lang/src/parser/tests.rs rename to crates/lang/src/lst_parser/tests.rs diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 515cbe0..517094d 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,7 +1,7 @@ use clap::Parser; use std::{fs, path::PathBuf}; -use lang::parser::{self, grammar, input, output::Output, syntax_kind}; +use lang::lst_parser::{self, grammar, input, output::Output, syntax_kind}; #[derive(Parser)] struct Args { @@ -16,7 +16,7 @@ fn main() { let toks = dbg!(syntax_kind::lex(&f)); let input = input::Input::new(&toks); - let mut parser = parser::Parser::new(input); + let mut parser = lst_parser::Parser::new(input); grammar::source_file(&mut parser); diff --git a/crates/lang/src/parser/grammar/expression.rs b/crates/lang/src/parser/grammar/expression.rs deleted file mode 100644 index 2d3460c..0000000 --- a/crates/lang/src/parser/grammar/expression.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::parser::{syntax_kind::SyntaxKind::*, CompletedMarker, Parser}; - -use self::{collection::collection, instruction::instr, lit::literal}; - -mod collection; -mod instruction; -mod lit; - -pub fn expression(p: &mut Parser) -> Option { - let expr = p.start("expr"); - - if atom(p).or_else(|| instr(p)).is_none() { - expr.abandon(p); - return None; - } - - Some(expr.complete(p, EXPR)) -} - -pub fn atom(p: &mut Parser) -> Option { - literal(p).or_else(|| collection(p)) -} diff --git a/testfiles/test.owo b/testfiles/test.owo index 51f07d1..bbcf720 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1 @@ -generator | { - foo, - bar -} | +meow 1 (3 | add 1) From afd493be16771b4e8fa056860073d96674a9b502 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 4 May 2024 21:44:02 +0200 Subject: [PATCH 129/189] lang: parse pipelines --- .../lang/src/lst_parser/grammar/expression.rs | 39 +------------------ .../lst_parser/grammar/expression/pipeline.rs | 36 +++++++++++++++++ crates/lang/src/lst_parser/syntax_kind.rs | 11 ++++++ 3 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 crates/lang/src/lst_parser/grammar/expression/pipeline.rs diff --git a/crates/lang/src/lst_parser/grammar/expression.rs b/crates/lang/src/lst_parser/grammar/expression.rs index 6ad7235..33ef3fc 100644 --- a/crates/lang/src/lst_parser/grammar/expression.rs +++ b/crates/lang/src/lst_parser/grammar/expression.rs @@ -5,44 +5,7 @@ use self::{collection::collection, instruction::instr, lit::literal, pipeline::P mod collection; mod instruction; mod lit; -mod pipeline { - use enumset::enum_set; - - use crate::lst_parser::{ - error::SyntaxError, - syntax_kind::{SyntaxKind::*, TokenSet}, - CompletedMarker, Parser, - }; - - use super::expression; - - pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option { - if !pipe(p) { - return Some(start_expr); - } - let pipeline_marker = start_expr.precede(p, "pipeline_start"); - - loop { - if expression(p, true).is_none() { - return Some(pipeline_marker.complete_err(p, SyntaxError::PipelineNeedsSink)); - } - if !pipe(p) { - return Some(pipeline_marker.complete(p, PIPELINE)); - } - } - } - - pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE); - - fn pipe(p: &mut Parser) -> bool { - if PIPES.contains(p.current()) { - p.do_bump(); - true - } else { - false - } - } -} +mod pipeline; pub fn expression(p: &mut Parser, in_pipe: bool) -> Option { let expr = p.start("expr"); diff --git a/crates/lang/src/lst_parser/grammar/expression/pipeline.rs b/crates/lang/src/lst_parser/grammar/expression/pipeline.rs new file mode 100644 index 0000000..f2f090d --- /dev/null +++ b/crates/lang/src/lst_parser/grammar/expression/pipeline.rs @@ -0,0 +1,36 @@ +use enumset::enum_set; + +use crate::lst_parser::{ + error::SyntaxError, + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, +}; + +use super::expression; + +pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option { + if !pipe(p) { + return Some(start_expr); + } + let pipeline_marker = start_expr.precede(p, "pipeline_start"); + + loop { + if expression(p, true).is_none() { + return Some(pipeline_marker.complete_err(p, SyntaxError::PipelineNeedsSink)); + } + if !pipe(p) { + return Some(pipeline_marker.complete(p, PIPELINE)); + } + } +} + +pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE); + +fn pipe(p: &mut Parser) -> bool { + if PIPES.contains(p.current()) { + p.do_bump(); + true + } else { + false + } +} diff --git a/crates/lang/src/lst_parser/syntax_kind.rs b/crates/lang/src/lst_parser/syntax_kind.rs index 3d817e3..4914aeb 100644 --- a/crates/lang/src/lst_parser/syntax_kind.rs +++ b/crates/lang/src/lst_parser/syntax_kind.rs @@ -19,10 +19,21 @@ pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { pub enum SyntaxKind { #[token("def")] DEF_KW = 0, + DEF, + DEF_NAME, + DEF_BODY, #[token("let")] LET_KW, #[token("in")] IN_KW, + LET_IN, + #[token("mod")] + MOD_KW, + MODULE, + MODULE_BODY, + #[token("use")] + USE_KW, + USE_PAT, #[regex("[\\d]+")] INT_NUM, #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")] From 29cdcfbe0ca7fa2bbcca463275b3e80331ef83b7 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 4 May 2024 21:56:12 +0200 Subject: [PATCH 130/189] lang: make output errors debuggable --- crates/lang/src/lst_parser/output.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/lang/src/lst_parser/output.rs b/crates/lang/src/lst_parser/output.rs index b530ac3..141d7d9 100644 --- a/crates/lang/src/lst_parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -9,9 +9,12 @@ pub struct Output { pub green_node: GreenNode, pub errors: Vec, } + impl std::fmt::Debug for Output { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - debug_print_green_node(NodeOrToken::Node(&self.green_node), f, 0) + let mut errs: Vec<&SyntaxError> = self.errors.iter().collect(); + errs.reverse(); + debug_print_green_node(NodeOrToken::Node(&self.green_node), f, 0, &mut errs) } } @@ -19,6 +22,7 @@ fn debug_print_green_node( node: NodeOrToken<&GreenNodeData, &GreenTokenData>, f: &mut std::fmt::Formatter<'_>, lvl: i32, + errs: &mut Vec<&SyntaxError>, ) -> std::fmt::Result { for _ in 0..lvl { f.write_str(" ")?; @@ -26,9 +30,18 @@ fn debug_print_green_node( match node { NodeOrToken::Node(n) => { - writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind()))?; + let kind = Lang::kind_from_raw(node.kind()); + if kind != SyntaxKind::PARSE_ERR { + writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind()))?; + } else { + let err = errs + .pop() + .expect("all error syntax nodes should correspond to an error"); + + writeln!(f, "{:?}: {err:?} {{", kind)?; + } for c in n.children() { - debug_print_green_node(c, f, lvl + 1)?; + debug_print_green_node(c, f, lvl + 1, errs)?; } for _ in 0..lvl { f.write_str(" ")?; From 4bcaf945d739fec76f2ba6ad6718f78af713c351 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 4 May 2024 22:35:18 +0200 Subject: [PATCH 131/189] lang: add highlighting to errors --- Cargo.lock | 37 ++++++++++++ crates/lang/Cargo.toml | 1 + crates/lang/src/lst_parser/input.rs | 15 ++++- crates/lang/src/lst_parser/output.rs | 86 ++++++++++++++++++++++++---- crates/lang/src/main.rs | 2 +- testfiles/test.owo | 2 +- 6 files changed, 128 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0252665..cc9818c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -469,6 +469,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "ident_case" version = "1.0.1" @@ -519,6 +525,23 @@ dependencies = [ "serde", ] +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "is_ci" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" + [[package]] name = "itoa" version = "1.0.10" @@ -546,6 +569,7 @@ dependencies = [ "indexmap", "indoc", "logos", + "owo-colors", "petgraph", "rowan", ] @@ -697,6 +721,9 @@ name = "owo-colors" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" +dependencies = [ + "supports-color", +] [[package]] name = "petgraph" @@ -974,6 +1001,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "supports-color" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" +dependencies = [ + "is-terminal", + "is_ci", +] + [[package]] name = "svg-filters" version = "0.1.0" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index c64720c..8a9c80b 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -16,6 +16,7 @@ rowan = "0.15.15" drop_bomb = "0.1.5" enumset = "1.1.3" indoc = "2" +owo-colors = {version = "4", features = ["supports-colors"]} [lints] workspace = true diff --git a/crates/lang/src/lst_parser/input.rs b/crates/lang/src/lst_parser/input.rs index e9a5e2e..a00d862 100644 --- a/crates/lang/src/lst_parser/input.rs +++ b/crates/lang/src/lst_parser/input.rs @@ -1,5 +1,9 @@ +use enumset::enum_set; + use crate::lst_parser::syntax_kind::SyntaxKind; +use super::syntax_kind::TokenSet; + pub struct Input<'src, 'toks> { raw: &'toks Vec<(SyntaxKind, &'src str)>, /// indices of the "meaningful" tokens (not whitespace etc) @@ -10,14 +14,19 @@ pub struct Input<'src, 'toks> { newlines: Vec, } +pub const MEANINGLESS_TOKS: TokenSet = enum_set!(SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE); + impl<'src, 'toks> Input<'src, 'toks> { pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { let meaningful = raw_toks .iter() .enumerate() - .filter_map(|(i, tok)| match tok.0 { - SyntaxKind::WHITESPACE | SyntaxKind::NEWLINE => None, - _ => Some(i), + .filter_map(|(i, tok)| { + if MEANINGLESS_TOKS.contains(tok.0) { + None + } else { + Some(i) + } }) .collect(); let newlines = raw_toks diff --git a/crates/lang/src/lst_parser/output.rs b/crates/lang/src/lst_parser/output.rs index 141d7d9..f17d97e 100644 --- a/crates/lang/src/lst_parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -1,7 +1,11 @@ +use owo_colors::{unset_override, OwoColorize}; use rowan::{GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken}; use std::mem; -use crate::lst_parser::syntax_kind::{Lang, SyntaxKind}; +use crate::lst_parser::{ + input::MEANINGLESS_TOKS, + syntax_kind::{Lang, SyntaxKind}, +}; use super::{error::SyntaxError, events::Event}; @@ -14,47 +18,109 @@ impl std::fmt::Debug for Output { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let mut errs: Vec<&SyntaxError> = self.errors.iter().collect(); errs.reverse(); - debug_print_green_node(NodeOrToken::Node(&self.green_node), f, 0, &mut errs) + + debug_print_green_node(NodeOrToken::Node(&self.green_node), f, 0, &mut errs, false) } } fn debug_print_green_node( node: NodeOrToken<&GreenNodeData, &GreenTokenData>, - f: &mut std::fmt::Formatter<'_>, + f: &mut dyn std::fmt::Write, lvl: i32, errs: &mut Vec<&SyntaxError>, + colored: bool, ) -> std::fmt::Result { for _ in 0..lvl { f.write_str(" ")?; } - match node { + if !colored { + owo_colors::set_override(false); + } else { + owo_colors::set_override(true); + } + + let r = match node { NodeOrToken::Node(n) => { let kind = Lang::kind_from_raw(node.kind()); if kind != SyntaxKind::PARSE_ERR { - writeln!(f, "{:?} {{", Lang::kind_from_raw(node.kind()))?; + writeln!( + f, + "{:?} {}", + Lang::kind_from_raw(node.kind()).bright_yellow().bold(), + "{".yellow() + )?; } else { let err = errs .pop() - .expect("all error syntax nodes should correspond to an error"); + .expect("all error syntax nodes should correspond to an error") + .bright_red(); - writeln!(f, "{:?}: {err:?} {{", kind)?; + writeln!( + f, + "{:?}{} {err:?} {}", + kind.bright_red().bold(), + ":".red(), + "{".bright_red().bold() + )?; } for c in n.children() { - debug_print_green_node(c, f, lvl + 1, errs)?; + debug_print_green_node(c, f, lvl + 1, errs, colored)?; } for _ in 0..lvl { f.write_str(" ")?; } - f.write_str("}\n") + if kind != SyntaxKind::PARSE_ERR { + write!(f, "{}", "}\n".yellow()) + } else { + write!(f, "{}", "}\n".bright_red().bold()) + } } NodeOrToken::Token(t) => { - writeln!(f, "{:?} {:?};", Lang::kind_from_raw(t.kind()), t.text()) + let tok = Lang::kind_from_raw(t.kind()); + if MEANINGLESS_TOKS.contains(tok) { + writeln!( + f, + "{:?} {:?}{}", + Lang::kind_from_raw(t.kind()).white(), + t.text().white(), + ";".white() + ) + } else { + writeln!( + f, + "{:?} {:?}{}", + Lang::kind_from_raw(t.kind()).bright_cyan().bold(), + t.text().green(), + ";".yellow() + ) + } } + }; + + if !colored { + owo_colors::unset_override(); } + + r } impl Output { + pub fn debug_colored(&self) -> String { + let mut out = String::new(); + let mut errs: Vec<&SyntaxError> = self.errors.iter().collect(); + errs.reverse(); + + let _ = debug_print_green_node( + NodeOrToken::Node(&self.green_node), + &mut out, + 0, + &mut errs, + true, + ); + + out + } pub fn from_parser_output( mut raw_toks: Vec<(SyntaxKind, &str)>, (mut events, errs): (Vec, Vec), diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 517094d..2531709 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -23,7 +23,7 @@ fn main() { let p_out = dbg!(parser.finish()); let o = Output::from_parser_output(toks, p_out); - println!("Out: {:?}", o); + println!("{}", o.debug_colored()); // let parse_res = parser::parse(&f); // println!("parse: {:?}", parse_res); diff --git a/testfiles/test.owo b/testfiles/test.owo index bbcf720..ac1af18 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1 @@ -meow 1 (3 | add 1) +meow | gay | From ed151c2e3c9d732739c8b03acbe42a9a5c70bd0b Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 4 May 2024 23:12:47 +0200 Subject: [PATCH 132/189] lang: handle and recover some errors in lists --- crates/lang/src/lst_parser/error.rs | 3 +++ .../grammar/expression/collection/vec.rs | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/crates/lang/src/lst_parser/error.rs b/crates/lang/src/lst_parser/error.rs index d13306c..1269acc 100644 --- a/crates/lang/src/lst_parser/error.rs +++ b/crates/lang/src/lst_parser/error.rs @@ -4,4 +4,7 @@ use crate::lst_parser::syntax_kind::SyntaxKind; pub enum SyntaxError { Expected(Vec), PipelineNeedsSink, + // if there was two space seperated items in a list + SpaceSepInList, + SemicolonInList, } diff --git a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs index fa76058..6e5884d 100644 --- a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs @@ -17,8 +17,10 @@ pub fn vec_matrix_list(p: &mut Parser) -> CompletedMarker { finish_mat_or_vec(p, start, row_start) } else if p.eat(R_BRACK) { + row_start.abandon(p); start.complete(p, LIST) } else { + row_start.abandon(p); start.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])) } } @@ -35,6 +37,21 @@ fn finish_list(p: &mut Parser, list_start: Marker) -> CompletedMarker { } } else if p.eat(R_BRACK) { return list_start.complete(p, LIST); + } else if let Some(item) = atom(p) { + item.precede(p, "next_item") + .complete(p, COLLECTION_ITEM) + .precede(p, "err_space_sep") + .complete_err(p, SyntaxError::SpaceSepInList); + } else if p.at(SEMICOLON) { + let semi_err = p.start("semicolon_err"); + p.eat(SEMICOLON); + semi_err.complete_err(p, SyntaxError::SemicolonInList); + if let Some(item) = atom(p) { + item.precede(p, "coll_item_start") + .complete(p, COLLECTION_ITEM); + } else if p.eat(R_BRACK) { + return list_start.complete(p, LIST); + } } } } From f6da90a354d5f1bbba51e57177f7a8270869c0f0 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 3 Jun 2024 10:53:59 +0200 Subject: [PATCH 133/189] lang: improve and simplify error handling and storage fixes wrong error ordering with errors using `forward_parents`. --- crates/lang/src/lst_parser.rs | 44 ++++++++++----- crates/lang/src/lst_parser/error.rs | 2 +- crates/lang/src/lst_parser/events.rs | 53 +++++++++++++++++-- .../lang/src/lst_parser/grammar/expression.rs | 2 +- .../grammar/expression/collection/vec.rs | 2 +- .../lst_parser/grammar/expression/pipeline.rs | 2 +- crates/lang/src/lst_parser/output.rs | 28 +++++++--- flake.nix | 19 ++----- 8 files changed, 110 insertions(+), 42 deletions(-) diff --git a/crates/lang/src/lst_parser.rs b/crates/lang/src/lst_parser.rs index 9b93010..a6ec4d7 100644 --- a/crates/lang/src/lst_parser.rs +++ b/crates/lang/src/lst_parser.rs @@ -1,6 +1,12 @@ use drop_bomb::DropBomb; -use self::{error::SyntaxError, events::Event, input::Input, syntax_kind::SyntaxKind}; +use self::{ + error::SyntaxError, + events::{Event, NodeKind}, + input::Input, + syntax_kind::SyntaxKind, +}; +use std::cell::Cell; pub mod syntax_kind; #[cfg(test)] @@ -12,11 +18,13 @@ pub mod grammar; pub mod input; pub mod output; +const PARSER_STEP_LIMIT: u32 = 4096; + pub struct Parser<'src, 'toks> { input: Input<'src, 'toks>, pos: usize, events: Vec, - errors: Vec, + steps: Cell, } impl<'src, 'toks> Parser<'src, 'toks> { @@ -25,15 +33,16 @@ impl<'src, 'toks> Parser<'src, 'toks> { input, pos: 0, events: Vec::new(), - errors: Vec::new(), + steps: Cell::new(0), } } - pub fn finish(self) -> (Vec, Vec) { - (self.events, self.errors) + pub fn finish(self) -> Vec { + self.events } pub(crate) fn nth(&self, n: usize) -> SyntaxKind { + self.step(); self.input.kind(self.pos + n) } @@ -44,6 +53,7 @@ impl<'src, 'toks> Parser<'src, 'toks> { } pub(crate) fn current(&self) -> SyntaxKind { + self.step(); self.input.kind(self.pos) } @@ -80,6 +90,12 @@ impl<'src, 'toks> Parser<'src, 'toks> { fn push_ev(&mut self, event: Event) { self.events.push(event) } + + fn step(&self) { + let steps = self.steps.get(); + assert!(steps <= PARSER_STEP_LIMIT, "the parser seems stuck..."); + self.steps.set(steps + 1); + } } pub(crate) struct Marker { @@ -95,12 +111,13 @@ impl Marker { } } - pub(crate) fn complete(mut self, p: &mut Parser<'_, '_>, kind: SyntaxKind) -> CompletedMarker { + fn complete_node(mut self, p: &mut Parser, kind: NodeKind) -> CompletedMarker { self.bomb.defuse(); match &mut p.events[self.pos] { - Event::Start { kind: slot, .. } => *slot = kind, + Event::Start { kind: slot, .. } => *slot = kind.clone(), _ => unreachable!(), } + p.push_ev(Event::Finish); CompletedMarker { @@ -109,9 +126,12 @@ impl Marker { } } - pub(crate) fn complete_err(mut self, p: &mut Parser, kind: SyntaxError) -> CompletedMarker { - p.errors.push(kind); - self.complete(p, SyntaxKind::PARSE_ERR) + pub(crate) fn complete(self, p: &mut Parser<'_, '_>, kind: SyntaxKind) -> CompletedMarker { + self.complete_node(p, NodeKind::Syntax(kind)) + } + + pub(crate) fn error(self, p: &mut Parser, kind: SyntaxError) -> CompletedMarker { + self.complete_node(p, NodeKind::Error(kind)) } pub(crate) fn abandon(mut self, p: &mut Parser<'_, '_>) { @@ -119,7 +139,7 @@ impl Marker { if self.pos == p.events.len() - 1 { match p.events.pop() { Some(Event::Start { - kind: SyntaxKind::TOMBSTONE, + kind: NodeKind::Syntax(SyntaxKind::TOMBSTONE), forward_parent: None, }) => (), _ => unreachable!(), @@ -130,7 +150,7 @@ impl Marker { pub(crate) struct CompletedMarker { pos: usize, - kind: SyntaxKind, + kind: NodeKind, } impl CompletedMarker { diff --git a/crates/lang/src/lst_parser/error.rs b/crates/lang/src/lst_parser/error.rs index 1269acc..7fa4431 100644 --- a/crates/lang/src/lst_parser/error.rs +++ b/crates/lang/src/lst_parser/error.rs @@ -1,6 +1,6 @@ use crate::lst_parser::syntax_kind::SyntaxKind; -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum SyntaxError { Expected(Vec), PipelineNeedsSink, diff --git a/crates/lang/src/lst_parser/events.rs b/crates/lang/src/lst_parser/events.rs index 00d7524..3ed630a 100644 --- a/crates/lang/src/lst_parser/events.rs +++ b/crates/lang/src/lst_parser/events.rs @@ -1,22 +1,69 @@ use crate::lst_parser::syntax_kind::SyntaxKind; +use super::error::SyntaxError; + #[derive(Debug)] pub enum Event { Start { - kind: SyntaxKind, + kind: NodeKind, forward_parent: Option, }, Finish, Eat { count: usize, }, - Error, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum NodeKind { + Syntax(SyntaxKind), + Error(SyntaxError), +} + +impl NodeKind { + pub fn is_syntax(&self) -> bool { + matches!(self, Self::Syntax(_)) + } + + pub fn is_error(&self) -> bool { + matches!(self, Self::Error(_)) + } +} + +impl From for NodeKind { + fn from(value: SyntaxKind) -> Self { + NodeKind::Syntax(value) + } +} + +impl From for NodeKind { + fn from(value: SyntaxError) -> Self { + NodeKind::Error(value) + } +} + +impl PartialEq for NodeKind { + fn eq(&self, other: &SyntaxKind) -> bool { + match self { + NodeKind::Syntax(s) => s == other, + NodeKind::Error(_) => false, + } + } +} + +impl PartialEq for NodeKind { + fn eq(&self, other: &SyntaxError) -> bool { + match self { + NodeKind::Syntax(_) => false, + NodeKind::Error(e) => e == other, + } + } } impl Event { pub(crate) fn tombstone() -> Self { Self::Start { - kind: SyntaxKind::TOMBSTONE, + kind: SyntaxKind::TOMBSTONE.into(), forward_parent: None, } } diff --git a/crates/lang/src/lst_parser/grammar/expression.rs b/crates/lang/src/lst_parser/grammar/expression.rs index 33ef3fc..03c0d10 100644 --- a/crates/lang/src/lst_parser/grammar/expression.rs +++ b/crates/lang/src/lst_parser/grammar/expression.rs @@ -35,7 +35,7 @@ pub fn parenthesized_expr(p: &mut Parser) -> Option { let par_expr = p.start("parenthesized"); expression(p, false); if !p.eat(R_PAREN) { - return Some(par_expr.complete_err(p, SyntaxError::Expected(vec![R_PAREN]))); + return Some(par_expr.error(p, SyntaxError::Expected(vec![R_PAREN]))); } return Some(par_expr.complete(p, PARENTHESIZED_EXPR)); diff --git a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs index 6e5884d..385723b 100644 --- a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs @@ -21,7 +21,7 @@ pub fn vec_matrix_list(p: &mut Parser) -> CompletedMarker { start.complete(p, LIST) } else { row_start.abandon(p); - start.complete_err(p, SyntaxError::Expected(vec![EXPR, R_BRACK])) + start.error(p, SyntaxError::Expected(vec![EXPR, R_BRACK])) } } diff --git a/crates/lang/src/lst_parser/grammar/expression/pipeline.rs b/crates/lang/src/lst_parser/grammar/expression/pipeline.rs index f2f090d..2c1c678 100644 --- a/crates/lang/src/lst_parser/grammar/expression/pipeline.rs +++ b/crates/lang/src/lst_parser/grammar/expression/pipeline.rs @@ -16,7 +16,7 @@ pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option, f: &mut dyn std::fmt::Write, @@ -31,7 +36,7 @@ fn debug_print_green_node( colored: bool, ) -> std::fmt::Result { for _ in 0..lvl { - f.write_str(" ")?; + f.write_str(INDENT_STR)?; } if !colored { @@ -68,7 +73,7 @@ fn debug_print_green_node( debug_print_green_node(c, f, lvl + 1, errs, colored)?; } for _ in 0..lvl { - f.write_str(" ")?; + f.write_str(INDENT_STR)?; } if kind != SyntaxKind::PARSE_ERR { write!(f, "{}", "}\n".yellow()) @@ -123,10 +128,11 @@ impl Output { } pub fn from_parser_output( mut raw_toks: Vec<(SyntaxKind, &str)>, - (mut events, errs): (Vec, Vec), + mut events: Vec, ) -> Self { let mut builder = GreenNodeBuilder::new(); let mut fw_parents = Vec::new(); + let mut errors = Vec::new(); raw_toks.reverse(); for i in 0..events.len() { @@ -170,8 +176,15 @@ impl Output { } for kind in fw_parents.drain(..).rev() { - if kind != SyntaxKind::TOMBSTONE { - builder.start_node(kind.into()); + match kind { + NodeKind::Syntax(kind) if kind != SyntaxKind::TOMBSTONE => { + builder.start_node(kind.into()) + } + NodeKind::Error(err) => { + errors.push(err); + builder.start_node(SyntaxKind::PARSE_ERR.into()) + } + _ => {} } } } @@ -180,13 +193,12 @@ impl Output { let (tok, text): (SyntaxKind, &str) = raw_toks.pop().unwrap(); builder.token(tok.into(), text); }), - Event::Error => todo!(), } } Self { green_node: builder.finish(), - errors: errs, + errors, } } } diff --git a/flake.nix b/flake.nix index caad7d6..8dd48aa 100644 --- a/flake.nix +++ b/flake.nix @@ -27,8 +27,7 @@ pkgs = nixpkgs.legacyPackages.${system}; toolchain = with fenix.packages.${system}; combine [ - default.toolchain - rust-analyzer + complete.toolchain ]; in { default = devenv.lib.mkShell { @@ -39,24 +38,14 @@ config, ... }: { - # languages.rust = { - # enable = true; - # channel = "nightly"; - # components = [ - # "rustc" - # "cargo" - # "clippy" - # "rustfmt" - # "rust-src" - # "rust-analyzer" - # ]; - # }; - pre-commit.hooks = { clippy.enable = false; rustfmt.enable = true; }; + env = { + RUST_BACKTRACE = 1; + }; packages = with pkgs; [ just nushell From 946ac879a7fa9135bdbdc5ba73b0738216955244 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 3 Jun 2024 11:22:36 +0200 Subject: [PATCH 134/189] lang: basic module syntax grammar --- crates/lang/src/lst_parser.rs | 6 +- crates/lang/src/lst_parser/error.rs | 3 + crates/lang/src/lst_parser/grammar.rs | 6 +- .../grammar/expression/collection/vec.rs | 13 ++- crates/lang/src/lst_parser/grammar/module.rs | 106 ++++++++++++++++++ crates/lang/src/lst_parser/syntax_kind.rs | 1 + testfiles/test.owo | 9 +- 7 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 crates/lang/src/lst_parser/grammar/module.rs diff --git a/crates/lang/src/lst_parser.rs b/crates/lang/src/lst_parser.rs index a6ec4d7..5c90bb0 100644 --- a/crates/lang/src/lst_parser.rs +++ b/crates/lang/src/lst_parser.rs @@ -111,7 +111,7 @@ impl Marker { } } - fn complete_node(mut self, p: &mut Parser, kind: NodeKind) -> CompletedMarker { + fn close_node(mut self, p: &mut Parser, kind: NodeKind) -> CompletedMarker { self.bomb.defuse(); match &mut p.events[self.pos] { Event::Start { kind: slot, .. } => *slot = kind.clone(), @@ -127,11 +127,11 @@ impl Marker { } pub(crate) fn complete(self, p: &mut Parser<'_, '_>, kind: SyntaxKind) -> CompletedMarker { - self.complete_node(p, NodeKind::Syntax(kind)) + self.close_node(p, NodeKind::Syntax(kind)) } pub(crate) fn error(self, p: &mut Parser, kind: SyntaxError) -> CompletedMarker { - self.complete_node(p, NodeKind::Error(kind)) + self.close_node(p, NodeKind::Error(kind)) } pub(crate) fn abandon(mut self, p: &mut Parser<'_, '_>) { diff --git a/crates/lang/src/lst_parser/error.rs b/crates/lang/src/lst_parser/error.rs index 7fa4431..04f5e7b 100644 --- a/crates/lang/src/lst_parser/error.rs +++ b/crates/lang/src/lst_parser/error.rs @@ -7,4 +7,7 @@ pub enum SyntaxError { // if there was two space seperated items in a list SpaceSepInList, SemicolonInList, + CommaInMatOrVec, + UnterminatedTopLevelItem, + UnclosedModuleBody, } diff --git a/crates/lang/src/lst_parser/grammar.rs b/crates/lang/src/lst_parser/grammar.rs index 9d081bb..2db0824 100644 --- a/crates/lang/src/lst_parser/grammar.rs +++ b/crates/lang/src/lst_parser/grammar.rs @@ -2,6 +2,8 @@ use std::fmt::Debug; use crate::lst_parser::syntax_kind::SyntaxKind::*; +use self::module::{mod_body, top_level_item}; + use super::{ input::Input, output::Output, @@ -10,11 +12,13 @@ use super::{ }; mod expression; +mod module; pub fn source_file(p: &mut Parser) { let root = p.start("root"); - expression::expression(p, false); + mod_body(p); + // expression::expression(p, false); p.eat_succeeding_ws(); root.complete(p, ROOT); diff --git a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs index 385723b..4dfd299 100644 --- a/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs +++ b/crates/lang/src/lst_parser/grammar/expression/collection/vec.rs @@ -25,7 +25,6 @@ pub fn vec_matrix_list(p: &mut Parser) -> CompletedMarker { } } -// TODO: handle semicolons, other wrong toks fn finish_list(p: &mut Parser, list_start: Marker) -> CompletedMarker { loop { if p.eat(COMMA) { @@ -41,11 +40,11 @@ fn finish_list(p: &mut Parser, list_start: Marker) -> CompletedMarker { item.precede(p, "next_item") .complete(p, COLLECTION_ITEM) .precede(p, "err_space_sep") - .complete_err(p, SyntaxError::SpaceSepInList); + .error(p, SyntaxError::SpaceSepInList); } else if p.at(SEMICOLON) { let semi_err = p.start("semicolon_err"); p.eat(SEMICOLON); - semi_err.complete_err(p, SyntaxError::SemicolonInList); + semi_err.error(p, SyntaxError::SemicolonInList); if let Some(item) = atom(p) { item.precede(p, "coll_item_start") .complete(p, COLLECTION_ITEM); @@ -85,6 +84,14 @@ fn finish_mat_or_vec(p: &mut Parser, coll_start: Marker, mut row_start: Marker) p.eat(R_BRACK); return coll_start.complete(p, VEC); } + } else if p.at(COMMA) { + let err_unexpected_comma = p.start("err_unexpected_comma"); + p.do_bump(); + err_unexpected_comma.error(p, SyntaxError::CommaInMatOrVec); + } else { + let err_unexpected = p.start("err_unexpected_tok"); + p.do_bump(); + err_unexpected.error(p, SyntaxError::Expected(vec![EXPR, SEMICOLON, R_BRACK])); } } } diff --git a/crates/lang/src/lst_parser/grammar/module.rs b/crates/lang/src/lst_parser/grammar/module.rs new file mode 100644 index 0000000..fe51d2c --- /dev/null +++ b/crates/lang/src/lst_parser/grammar/module.rs @@ -0,0 +1,106 @@ +use enumset::enum_set; + +use crate::lst_parser::{ + error::SyntaxError, + grammar::expression::expression, + syntax_kind::{SyntaxKind::*, TokenSet}, + CompletedMarker, Parser, +}; + +const TOP_LEVEL_ITEM_START: TokenSet = enum_set!(DEF_KW | MOD_KW | USE_KW); + +pub fn mod_body(p: &mut Parser) { + loop { + if top_level_item(p).is_none() { + break; + } + } +} + +fn mod_decl(p: &mut Parser) -> Option { + let mod_start = p.start("module"); + if !p.eat(MOD_KW) { + return None; + } + + let mod_name = p.start("module_name"); + if p.eat(IDENT) { + mod_name.complete(p, MODULE_NAME); + } else { + mod_name.error(p, SyntaxError::Expected(vec![IDENT])); + } + + let mod_body_marker = p.start("mod_body"); + if p.eat(SEMICOLON) { + mod_body_marker.abandon(p); + Some(mod_start.complete(p, MODULE)) + } else if p.eat(L_BRACE) { + mod_body(p); + if !p.eat(R_BRACE) { + mod_body_marker + .complete(p, MODULE_BODY) + .precede(p, "unclosed_mod_body_err") + .error(p, SyntaxError::UnclosedModuleBody); + } else { + mod_body_marker.complete(p, MODULE_BODY); + } + Some(mod_start.complete(p, MODULE)) + } else { + Some(mod_start.error(p, SyntaxError::Expected(vec![MODULE_BODY]))) + } +} + +pub fn top_level_item(p: &mut Parser) -> Option { + if !TOP_LEVEL_ITEM_START.contains(p.current()) { + return None; + } + def(p).or_else(|| mod_decl(p)) +} + +fn def(p: &mut Parser) -> Option { + let def_start = p.start("top_level_def"); + if !p.eat(DEF_KW) { + def_start.abandon(p); + return None; + } + + let def_name = p.start("def_name"); + if p.eat(IDENT) { + def_name.complete(p, DEF_NAME); + } else { + def_name.error(p, SyntaxError::Expected(vec![IDENT])); + } + + let maybe_expected_eq = p.start("maybe_expect_eq"); + if !p.eat(EQ) { + maybe_expected_eq.error(p, SyntaxError::Expected(vec![EQ])); + } else { + maybe_expected_eq.abandon(p); + } + + let body = p.start("def_body"); + if expression(p, false).is_some() { + body.complete(p, DEF_BODY); + } else { + body.error(p, SyntaxError::Expected(vec![DEF_BODY])); + } + + let def = def_start.complete(p, DEF); + Some(if p.eat(SEMICOLON) { + def + } else if TOP_LEVEL_ITEM_START.contains(p.current()) || p.at(EOF) { + def.precede(p, "unterminated_tl_item") + .error(p, SyntaxError::UnterminatedTopLevelItem) + } else { + def.precede(p, "err_unexpected") + .error(p, SyntaxError::Expected(vec![SEMICOLON])) + }) +} + +fn r#use(p: &mut Parser) -> Option { + if !p.eat(USE_KW) { + return None; + } + + todo!() +} diff --git a/crates/lang/src/lst_parser/syntax_kind.rs b/crates/lang/src/lst_parser/syntax_kind.rs index 4914aeb..7b0fe41 100644 --- a/crates/lang/src/lst_parser/syntax_kind.rs +++ b/crates/lang/src/lst_parser/syntax_kind.rs @@ -30,6 +30,7 @@ pub enum SyntaxKind { #[token("mod")] MOD_KW, MODULE, + MODULE_NAME, MODULE_BODY, #[token("use")] USE_KW, diff --git a/testfiles/test.owo b/testfiles/test.owo index ac1af18..b50e5c6 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1 +1,8 @@ -meow | gay | +def hello_world = meow [ 1 2 ] + +def test + +mod hello { + def meow = uwu; +} + From 0de076ace166de49372580c0a8980ab356b6559b Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 3 Jun 2024 12:05:38 +0200 Subject: [PATCH 135/189] lang: finish module/top level syntax --- crates/lang/src/lst_parser/error.rs | 2 + crates/lang/src/lst_parser/grammar/module.rs | 77 +++++++++++++++++++- crates/lang/src/lst_parser/syntax_kind.rs | 6 ++ testfiles/test.owo | 4 +- 4 files changed, 86 insertions(+), 3 deletions(-) diff --git a/crates/lang/src/lst_parser/error.rs b/crates/lang/src/lst_parser/error.rs index 04f5e7b..73f290f 100644 --- a/crates/lang/src/lst_parser/error.rs +++ b/crates/lang/src/lst_parser/error.rs @@ -10,4 +10,6 @@ pub enum SyntaxError { CommaInMatOrVec, UnterminatedTopLevelItem, UnclosedModuleBody, + UnfinishedPath, + PathSepContainsSemicolon, } diff --git a/crates/lang/src/lst_parser/grammar/module.rs b/crates/lang/src/lst_parser/grammar/module.rs index fe51d2c..1bce2a4 100644 --- a/crates/lang/src/lst_parser/grammar/module.rs +++ b/crates/lang/src/lst_parser/grammar/module.rs @@ -20,6 +20,7 @@ pub fn mod_body(p: &mut Parser) { fn mod_decl(p: &mut Parser) -> Option { let mod_start = p.start("module"); if !p.eat(MOD_KW) { + mod_start.abandon(p); return None; } @@ -54,7 +55,7 @@ pub fn top_level_item(p: &mut Parser) -> Option { if !TOP_LEVEL_ITEM_START.contains(p.current()) { return None; } - def(p).or_else(|| mod_decl(p)) + def(p).or_else(|| mod_decl(p)).or_else(|| r#use(p)) } fn def(p: &mut Parser) -> Option { @@ -98,9 +99,81 @@ fn def(p: &mut Parser) -> Option { } fn r#use(p: &mut Parser) -> Option { + let use_start = p.start("use_start"); if !p.eat(USE_KW) { + use_start.abandon(p); return None; } - todo!() + if use_pat(p).is_none() { + p.start("expected_use_pat") + .error(p, SyntaxError::Expected(vec![USE_PAT])); + } + + let use_item = use_start.complete(p, DEF); + Some(if p.eat(SEMICOLON) { + use_item + } else if TOP_LEVEL_ITEM_START.contains(p.current()) || p.at(EOF) { + use_item + .precede(p, "unterminated_tl_item") + .error(p, SyntaxError::UnterminatedTopLevelItem) + } else { + use_item + .precede(p, "err_unexpected") + .error(p, SyntaxError::Expected(vec![SEMICOLON])) + }) +} + +fn use_pat(p: &mut Parser) -> Option { + let use_pat_marker = p.start("use_pat"); + if !p.eat(IDENT) { + return None; + } + + loop { + if p.eat(PATH_SEP) { + if pat_item(p).is_none() { + break Some(use_pat_marker.error(p, SyntaxError::UnfinishedPath)); + } + } else if p.at(SEMICOLON) && p.nth_at(1, COLON) { + let broken_sep = p.start("broken_path_sep"); + let wrong_semi = p.start("semi_typo"); + p.eat(SEMICOLON); + wrong_semi.error(p, SyntaxError::PathSepContainsSemicolon); + p.eat(COLON); + broken_sep.complete(p, PATH_SEP); + } else if p.at(COLON) && p.nth_at(1, SEMICOLON) { + let broken_sep = p.start("broken_path_sep"); + p.eat(COLON); + let wrong_semi = p.start("semi_typo"); + p.eat(SEMICOLON); + wrong_semi.error(p, SyntaxError::PathSepContainsSemicolon); + broken_sep.complete(p, PATH_SEP); + } else if p.at(SEMICOLON) && p.nth_at(1, SEMICOLON) { + let broken_sep = p.start("broken_path_sep"); + p.eat(SEMICOLON); + p.eat(SEMICOLON); + broken_sep + .complete(p, PATH_SEP) + .precede(p, "semi_typo_err") + .error(p, SyntaxError::PathSepContainsSemicolon); + } else if p.at(SEMICOLON) { + break Some(use_pat_marker.complete(p, USE_PAT)); + } else { + break Some(use_pat_marker.error(p, SyntaxError::Expected(vec![PATH_SEP, SEMICOLON]))); + } + } +} + +fn pat_item(p: &mut Parser) -> Option { + let item_start = p.start("pat_item_start"); + if p.eat(IDENT) { + Some(item_start.complete(p, PAT_ITEM)) + } else if p.eat(STAR) { + Some(item_start.complete(p, PAT_GLOB)) + } else if p.eat(L_BRACE) { + todo!("write PAT_GROUPs") + } else { + None + } } diff --git a/crates/lang/src/lst_parser/syntax_kind.rs b/crates/lang/src/lst_parser/syntax_kind.rs index 7b0fe41..87230e7 100644 --- a/crates/lang/src/lst_parser/syntax_kind.rs +++ b/crates/lang/src/lst_parser/syntax_kind.rs @@ -27,14 +27,20 @@ pub enum SyntaxKind { #[token("in")] IN_KW, LET_IN, + #[token("::")] + PATH_SEP, #[token("mod")] MOD_KW, MODULE, MODULE_NAME, MODULE_BODY, + USE, #[token("use")] USE_KW, USE_PAT, + PAT_ITEM, + PAT_GLOB, + PAT_GROUP, #[regex("[\\d]+")] INT_NUM, #[regex("[+-]?([\\d]+\\.[\\d]*|[\\d]*\\.[\\d]+)")] diff --git a/testfiles/test.owo b/testfiles/test.owo index b50e5c6..f94256a 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,4 +1,6 @@ -def hello_world = meow [ 1 2 ] +use hello::meow; + +def hello_world = meow [ 1 2 ]; def test From cfefab9fd05fa8ecff99f99901a1cb77485f83e8 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 5 Jun 2024 09:57:08 +0200 Subject: [PATCH 136/189] lang: fix some details in the parser --- crates/lang/src/lst_parser/grammar/module.rs | 24 +++++++++++++++----- testfiles/test.owo | 1 + 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/crates/lang/src/lst_parser/grammar/module.rs b/crates/lang/src/lst_parser/grammar/module.rs index 1bce2a4..008627c 100644 --- a/crates/lang/src/lst_parser/grammar/module.rs +++ b/crates/lang/src/lst_parser/grammar/module.rs @@ -86,14 +86,17 @@ fn def(p: &mut Parser) -> Option { body.error(p, SyntaxError::Expected(vec![DEF_BODY])); } - let def = def_start.complete(p, DEF); Some(if p.eat(SEMICOLON) { - def + def_start.complete(p, DEF) } else if TOP_LEVEL_ITEM_START.contains(p.current()) || p.at(EOF) { - def.precede(p, "unterminated_tl_item") + def_start + .complete(p, DEF) + .precede(p, "unterminated_tl_item") .error(p, SyntaxError::UnterminatedTopLevelItem) } else { - def.precede(p, "err_unexpected") + def_start + .complete(p, DEF) + .precede(p, "err_unexpected") .error(p, SyntaxError::Expected(vec![SEMICOLON])) }) } @@ -110,7 +113,7 @@ fn r#use(p: &mut Parser) -> Option { .error(p, SyntaxError::Expected(vec![USE_PAT])); } - let use_item = use_start.complete(p, DEF); + let use_item = use_start.complete(p, USE); Some(if p.eat(SEMICOLON) { use_item } else if TOP_LEVEL_ITEM_START.contains(p.current()) || p.at(EOF) { @@ -142,6 +145,9 @@ fn use_pat(p: &mut Parser) -> Option { wrong_semi.error(p, SyntaxError::PathSepContainsSemicolon); p.eat(COLON); broken_sep.complete(p, PATH_SEP); + if pat_item(p).is_none() { + break Some(use_pat_marker.error(p, SyntaxError::UnfinishedPath)); + } } else if p.at(COLON) && p.nth_at(1, SEMICOLON) { let broken_sep = p.start("broken_path_sep"); p.eat(COLON); @@ -149,6 +155,9 @@ fn use_pat(p: &mut Parser) -> Option { p.eat(SEMICOLON); wrong_semi.error(p, SyntaxError::PathSepContainsSemicolon); broken_sep.complete(p, PATH_SEP); + if pat_item(p).is_none() { + break Some(use_pat_marker.error(p, SyntaxError::UnfinishedPath)); + } } else if p.at(SEMICOLON) && p.nth_at(1, SEMICOLON) { let broken_sep = p.start("broken_path_sep"); p.eat(SEMICOLON); @@ -157,7 +166,10 @@ fn use_pat(p: &mut Parser) -> Option { .complete(p, PATH_SEP) .precede(p, "semi_typo_err") .error(p, SyntaxError::PathSepContainsSemicolon); - } else if p.at(SEMICOLON) { + if pat_item(p).is_none() { + break Some(use_pat_marker.error(p, SyntaxError::UnfinishedPath)); + } + } else if p.eat(SEMICOLON) { break Some(use_pat_marker.complete(p, USE_PAT)); } else { break Some(use_pat_marker.error(p, SyntaxError::Expected(vec![PATH_SEP, SEMICOLON]))); diff --git a/testfiles/test.owo b/testfiles/test.owo index f94256a..4f06140 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -5,6 +5,7 @@ def hello_world = meow [ 1 2 ]; def test mod hello { + use gay:;uwu_meow::*; def meow = uwu; } From d6bc644fb6fd6340c731045286ecb09258f9a3b9 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 5 Jun 2024 18:00:14 +0200 Subject: [PATCH 137/189] lang: basic ast work --- crates/lang/src/ast.rs | 68 ++++++ crates/lang/src/ast/error.rs | 30 +++ crates/lang/src/ast/mod_tree.rs | 248 ++++++++++++++++++++++ crates/lang/src/ast/nodes.rs | 77 +++++++ crates/lang/src/ast/source_file.rs | 80 +++++++ crates/lang/src/lib.rs | 22 ++ crates/lang/src/lst_parser/output.rs | 14 +- crates/lang/src/lst_parser/syntax_kind.rs | 16 -- crates/lang/src/main.rs | 42 ++-- testfiles/hello.owo | 1 + testfiles/hello/meow.owo | 2 + testfiles/test.owo | 17 +- testfiles/uwu.owo | 1 + 13 files changed, 560 insertions(+), 58 deletions(-) create mode 100644 crates/lang/src/ast.rs create mode 100644 crates/lang/src/ast/error.rs create mode 100644 crates/lang/src/ast/mod_tree.rs create mode 100644 crates/lang/src/ast/nodes.rs create mode 100644 crates/lang/src/ast/source_file.rs create mode 100644 testfiles/hello.owo create mode 100644 testfiles/hello/meow.owo create mode 100644 testfiles/uwu.owo diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs new file mode 100644 index 0000000..1375694 --- /dev/null +++ b/crates/lang/src/ast.rs @@ -0,0 +1,68 @@ +use std::{collections::HashMap, path::PathBuf, sync::Arc}; + +use rowan::ast::{AstNode, AstPtr}; + +use self::{ + error::{Error, WorldCreationError}, + mod_tree::{Module, ModuleTree}, + source_file::SourceFile, +}; + +mod error; +mod mod_tree; +mod nodes; +mod source_file; + +struct Loc { + file: PathBuf, + syntax_el: AstPtr, +} + +impl Loc { + pub fn new(file: PathBuf, syntax_el: &T) -> Self { + Self { + file, + syntax_el: AstPtr::new(syntax_el), + } + } +} + +pub struct World { + entry_point: PathBuf, + files: HashMap, + errors: Vec, + module_tree: ModuleTree, +} + +impl World { + pub fn new(entry_point: PathBuf) -> Result { + let entry_point = entry_point.canonicalize().unwrap(); + let source = match std::fs::read_to_string(&entry_point) { + Ok(f) => f, + Err(e) => return Err(WorldCreationError::FailedToOpenEntryPoint(entry_point, e)), + }; + + let (src, mut errors) = SourceFile::parse_from(entry_point.clone(), source); + + let (module_tree, mut files, new_errors) = ModuleTree::parse_from_main(&entry_point, &src); + errors.extend(new_errors); + module_tree.print_tree(&src.tree()); + dbg!(&errors); + + let _ = files.insert(entry_point.clone(), src); + + Ok(Self { + files, + entry_point, + errors, + module_tree, + }) + } + + // fn parse_mod_tree(files: &mut HashMap) +} + +// struct SourceFile { +// tree: SyntaxNode, +// items: Vec, +// } diff --git a/crates/lang/src/ast/error.rs b/crates/lang/src/ast/error.rs new file mode 100644 index 0000000..352e831 --- /dev/null +++ b/crates/lang/src/ast/error.rs @@ -0,0 +1,30 @@ +use std::{fmt::Display, path::PathBuf}; + +use crate::lst_parser::error::SyntaxError; + +#[derive(Debug)] +pub enum Error { + Syntax(PathBuf, SyntaxError), + FailedToOpenFileMod(PathBuf, std::io::Error), +} + +impl Error { + pub fn from_syntax(file: PathBuf, e: SyntaxError) -> Self { + Self::Syntax(file, e) + } +} + +#[derive(Debug)] +pub enum WorldCreationError { + FailedToOpenEntryPoint(PathBuf, std::io::Error), +} + +impl Display for WorldCreationError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + WorldCreationError::FailedToOpenEntryPoint(entry_path, e) => { + write!(f, "failed to open entry_point '{entry_path:?}': {e}") + } + } + } +} diff --git a/crates/lang/src/ast/mod_tree.rs b/crates/lang/src/ast/mod_tree.rs new file mode 100644 index 0000000..035faec --- /dev/null +++ b/crates/lang/src/ast/mod_tree.rs @@ -0,0 +1,248 @@ +use std::{ + collections::{HashMap, HashSet}, + path::PathBuf, + sync::Arc, +}; + +use rowan::ast::{AstNode, AstPtr}; + +use crate::{lst_parser::syntax_kind::SyntaxKind, SyntaxNode}; + +use super::{ + error::Error, + nodes::{self, Mod, ModBody, ModName, Root}, + source_file::SourceFile, + Loc, +}; + +pub struct ModuleTree { + modules: HashMap>, +} + +impl ModuleTree { + pub fn parse_from_main( + path: &PathBuf, + main_file: &SourceFile, + ) -> (Self, HashMap, Vec) { + let tree = main_file.tree(); + let mut files = HashMap::new(); + let mut errors = Vec::new(); + + let entry_path = path.parent().unwrap().to_owned(); + let modules = main_file + .top_level_modules() + .into_iter() + .filter_map(|m| { + let module = + Module::parse_mod(m.to_node(tree.syntax()), Vec::new(), &path, &entry_path); + match module { + Ok(module) => { + files.extend(module.1); + errors.extend(module.2); + Some((module.0.name(), Arc::new(module.0))) + } + Err(err) => { + errors.push(err); + None + } + } + }) + .collect::>>(); + + (Self { modules }, files, errors) + } + + pub fn print_tree(&self, lst: &Root) { + let name = "main"; + print_tree(&name, &self.modules, 0) + } +} + +pub struct Module { + path: Vec, + name: String, + kind: ModuleKind, + children: HashMap>, + parent: Option>, +} + +impl Module { + fn parse_mod( + module: Mod, + cur_path: Vec, + cur_file: &PathBuf, + entry_path: &PathBuf, + ) -> Result<(Self, HashMap, Vec), Error> { + dbg!(cur_file); + dbg!(entry_path); + let children = module + .syntax() + .children() + // .map(|n| n.kind()) + .collect::>(); + + if children.len() == 1 { + let name = &children[0]; + assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); + return Self::parse_file_mod( + name.text().to_string(), + Loc::new(cur_file.clone(), &module), + cur_path, + entry_path, + ); + } else if children.len() == 2 { + let name = &children[0]; + assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); + let body = &children[1]; + assert_eq!(body.kind(), SyntaxKind::MODULE_BODY); + return Ok(Self::parse_inline_mod( + module, cur_path, cur_file, entry_path, + )); + } + todo!() + } + + fn parse_file_mod( + name: String, + decl: Loc, + mut cur_path: Vec, + entry_path: &PathBuf, + ) -> Result<(Self, HashMap, Vec), Error> { + let mut mod_file_path = entry_path.to_owned(); + + for el in &cur_path { + mod_file_path.push(format!("{el}/")); + } + mod_file_path.push(format!("{name}.owo")); + + let mut files = HashMap::new(); + let mut errors = Vec::new(); + + let source = match std::fs::read_to_string(dbg!(&mod_file_path)) { + Ok(f) => f, + Err(e) => return Err(Error::FailedToOpenFileMod(mod_file_path, e)), + }; + + let (source_file, file_errors) = SourceFile::parse_from(mod_file_path.clone(), source); + errors.extend(file_errors); + + let tree = source_file.tree(); + let old_path = cur_path.clone(); + cur_path.push(name.clone()); + let children = source_file + .top_level_modules() + .into_iter() + .filter_map(|m| { + let module = Module::parse_mod( + m.to_node(tree.syntax()), + cur_path.clone(), + &mod_file_path, + &entry_path, + ); + match module { + Ok(module) => { + files.extend(module.1); + errors.extend(module.2); + Some((module.0.name(), Arc::new(module.0))) + } + Err(err) => { + errors.push(err); + None + } + } + }) + .collect::>>(); + + files.insert(mod_file_path.clone(), source_file); + + Ok(( + Self { + path: old_path, + name, + kind: ModuleKind::File { + declaration: decl, + file_id: mod_file_path, + }, + children, + parent: None, + }, + files, + errors, + )) + } + + fn parse_inline_mod( + module: Mod, + mut cur_path: Vec, + cur_file: &PathBuf, + entry_path: &PathBuf, + ) -> (Self, HashMap, Vec) { + let mut children = module.syntax().children().collect::>(); + + let body = ModBody::cast(children.pop().unwrap()).unwrap(); + let name = ModName::cast(children.pop().unwrap()).unwrap(); + + let mut files = HashMap::new(); + let mut errors = Vec::new(); + + let old_path = cur_path.clone(); + cur_path.push(name.syntax().to_string()); + let children = body + .syntax() + .children() + .filter_map(|node| Mod::cast(node)) + .filter_map(|m| { + let m = Self::parse_mod(m, cur_path.clone(), cur_file, entry_path); + match m { + Ok(module) => { + files.extend(module.1); + errors.extend(module.2); + Some((module.0.name(), Arc::new(module.0))) + } + Err(err) => { + errors.push(err); + None + } + } + }) + .collect::>>(); + + ( + Self { + name: name.syntax().text().to_string(), + kind: ModuleKind::Inline(Loc::new(cur_file.to_owned(), &module)), + children, + parent: None, + path: old_path, + }, + files, + errors, + ) + } + + pub fn name(&self) -> String { + // self.name.to_node(lst.syntax()).syntax().text().to_string() + self.name.clone() + } +} + +fn print_tree(name: &str, children: &HashMap>, level: u32) { + const INDENT_STR: &str = " "; + + for _ in 0..level { + print!("{}", INDENT_STR); + } + print!("{name}\n"); + + for (name, module) in children { + print_tree(name, &module.children, level + 1); + } +} + +enum ModuleKind { + Inline(Loc), + File { + declaration: Loc, + file_id: PathBuf, + }, +} diff --git a/crates/lang/src/ast/nodes.rs b/crates/lang/src/ast/nodes.rs new file mode 100644 index 0000000..e59c0f3 --- /dev/null +++ b/crates/lang/src/ast/nodes.rs @@ -0,0 +1,77 @@ +use crate::lst_parser::syntax_kind::SyntaxKind::*; +use crate::SyntaxNode; +use rowan::Language; +macro_rules! ast_nodes { + ($($ast:ident, $kind:ident);+) => { + $( + #[derive(PartialEq, Eq, Hash)] + #[repr(transparent)] + pub struct $ast(SyntaxNode); + impl rowan::ast::AstNode for $ast { + type Language = crate::Lang; + + fn can_cast(kind: ::Kind) -> bool { + kind == $kind + } + + fn cast(node: SyntaxNode) -> Option { + if node.kind() == $kind { + Some(Self(node)) + } else { + None + } + } + + fn syntax(&self) -> &SyntaxNode { + &self.0 + } + } + )+ + }; +} +ast_nodes!( + Def, DEF; + DefName, DEF_NAME; + DefBody, DEF_BODY; + + Mod, MODULE; + ModName, MODULE_NAME; + ModBody, MODULE_BODY; + + Use, USE; + UsePat, USE_PAT; + PatItem, PAT_ITEM; + PatGlob, PAT_GLOB; + PatGroup, PAT_GROUP; + + Literal, LITERAL; + IntLit, INT_NUM; + FloatLit, FLOAT_NUM; + StringLit, STRING; + + Matrix, MATRIX; + MatrixRow, MAT_ROW; + Vector, VEC; + List, LIST; + CollectionItem, COLLECTION_ITEM; + + ParenthesizedExpr, PARENTHESIZED_EXPR; + Expression, EXPR; + + Pipeline, PIPELINE; + + Instruction, INSTR; + InstructionName, INSTR_NAME; + InstructionParams, INSTR_PARAMS; + + AttributeSet, ATTR_SET; + Attribute, ATTR; + AttributeName, ATTR_NAME; + AttributeValue, ATTR_VALUE; + + ParseError, PARSE_ERR; + LexError, LEX_ERR; + + Root, ROOT; + Eof, EOF +); diff --git a/crates/lang/src/ast/source_file.rs b/crates/lang/src/ast/source_file.rs new file mode 100644 index 0000000..e6e33be --- /dev/null +++ b/crates/lang/src/ast/source_file.rs @@ -0,0 +1,80 @@ +use std::path::PathBuf; + +use rowan::ast::{AstNode, AstPtr}; + +use crate::lst_parser::{ + grammar::source_file, + input::Input, + output::Output, + syntax_kind::{self, SyntaxKind}, + Parser, +}; + +use super::{ + error::Error, + nodes::{Def, Mod, Root, Use}, +}; + +pub struct SourceFile { + lst: Root, + modules: Vec>, + defs: Vec>, + uses: Vec>, +} + +impl SourceFile { + pub fn parse_from(path: PathBuf, source_text: String) -> (Self, Vec) { + let toks = syntax_kind::lex(&source_text); + let input = Input::new(&toks); + let mut parser = Parser::new(input); + + source_file(&mut parser); + + let parser_out = parser.finish(); + let out = Output::from_parser_output(toks, parser_out); + + let lst = out.syntax(); + + let mut modules = Vec::new(); + let mut defs = Vec::new(); + let mut uses = Vec::new(); + + for c in lst.children() { + match c.kind() { + SyntaxKind::MODULE => modules.push(AstPtr::new(&Mod::cast(c).unwrap())), + SyntaxKind::DEF => defs.push(AstPtr::new(&Def::cast(c).unwrap())), + SyntaxKind::USE => uses.push(AstPtr::new(&Use::cast(c).unwrap())), + _ => {} + } + } + + ( + Self { + lst: Root::cast(lst).unwrap(), + modules, + defs, + uses, + }, + out.errors() + .into_iter() + .map(|err| Error::from_syntax(path.clone(), err)) + .collect(), + ) + } + + pub fn tree(&self) -> &Root { + &self.lst + } + + pub fn top_level_modules(&self) -> Vec> { + self.modules.clone() + } + + pub fn top_level_defs(&self) -> Vec> { + self.defs.clone() + } + + pub fn top_level_uses(&self) -> Vec> { + self.uses.clone() + } +} diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index e552496..d700d45 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,2 +1,24 @@ #![feature(type_alias_impl_trait, lint_reasons)] + +use crate::lst_parser::syntax_kind::SyntaxKind; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Lang {} +impl rowan::Language for Lang { + type Kind = SyntaxKind; + #[allow(unsafe_code)] + fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind { + assert!(raw.0 <= SyntaxKind::ROOT as u16); + unsafe { std::mem::transmute::(raw.0) } + } + fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind { + kind.into() + } +} + +pub type SyntaxNode = rowan::SyntaxNode; +pub type SyntaxToken = rowan::SyntaxNode; +pub type SyntaxElement = rowan::NodeOrToken; + +pub mod ast; pub mod lst_parser; diff --git a/crates/lang/src/lst_parser/output.rs b/crates/lang/src/lst_parser/output.rs index 49d29c6..af483ab 100644 --- a/crates/lang/src/lst_parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -3,9 +3,9 @@ use owo_colors::{unset_override, OwoColorize}; use rowan::{GreenNode, GreenNodeBuilder, GreenNodeData, GreenTokenData, Language, NodeOrToken}; use std::mem; -use crate::lst_parser::{ - input::MEANINGLESS_TOKS, - syntax_kind::{Lang, SyntaxKind}, +use crate::{ + lst_parser::{input::MEANINGLESS_TOKS, syntax_kind::SyntaxKind}, + Lang, SyntaxNode, }; use super::{ @@ -201,4 +201,12 @@ impl Output { errors, } } + + pub fn syntax(&self) -> SyntaxNode { + SyntaxNode::new_root(self.green_node.clone()) + } + + pub fn errors(&self) -> Vec { + self.errors.clone() + } } diff --git a/crates/lang/src/lst_parser/syntax_kind.rs b/crates/lang/src/lst_parser/syntax_kind.rs index 87230e7..5cb7fb1 100644 --- a/crates/lang/src/lst_parser/syntax_kind.rs +++ b/crates/lang/src/lst_parser/syntax_kind.rs @@ -53,7 +53,6 @@ pub enum SyntaxKind { LIST, // either of a vec, a matrix or a list COLLECTION_ITEM, - DECL, PARENTHESIZED_EXPR, EXPR, LITERAL, @@ -130,7 +129,6 @@ pub enum SyntaxKind { ROOT, EOF, TOMBSTONE, - ERROR, } pub type TokenSet = EnumSet; @@ -140,17 +138,3 @@ impl From for rowan::SyntaxKind { Self(kind as u16) } } - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum Lang {} -impl rowan::Language for Lang { - type Kind = SyntaxKind; - #[allow(unsafe_code)] - fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind { - assert!(raw.0 <= SyntaxKind::ROOT as u16); - unsafe { std::mem::transmute::(raw.0) } - } - fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind { - kind.into() - } -} diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 2531709..1dbd527 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,7 +1,10 @@ use clap::Parser; use std::{fs, path::PathBuf}; -use lang::lst_parser::{self, grammar, input, output::Output, syntax_kind}; +use lang::{ + ast::World, + lst_parser::{self, grammar, input, output::Output, syntax_kind}, +}; #[derive(Parser)] struct Args { @@ -12,37 +15,18 @@ struct Args { fn main() { let args = Args::parse(); let n = args.file.clone(); - let f = fs::read_to_string(n.clone()).expect("failed to read file"); + // let f = fs::read_to_string(n.clone()).expect("failed to read file"); - let toks = dbg!(syntax_kind::lex(&f)); - let input = input::Input::new(&toks); - let mut parser = lst_parser::Parser::new(input); + // let toks = dbg!(syntax_kind::lex(&f)); + // let input = input::Input::new(&toks); + // let mut parser = lst_parser::Parser::new(input); - grammar::source_file(&mut parser); + // grammar::source_file(&mut parser); - let p_out = dbg!(parser.finish()); - let o = Output::from_parser_output(toks, p_out); + // let p_out = dbg!(parser.finish()); + // let o = Output::from_parser_output(toks, p_out); - println!("{}", o.debug_colored()); + // println!("{}", o.debug_colored()); - // let parse_res = parser::parse(&f); - // println!("parse: {:?}", parse_res); - - // dbg!(lex::lex(&f)); - // let mut err_collector = ErrorCollector::new(vec![(n.to_str().unwrap(), &f)]); - - // println!("file: {f}\n"); - // let parse_res = parse(&f); - // err_collector.insert_many( - // args.file.to_str().unwrap(), - // lang::err_reporting::Stage::Parse, - // parse_res - // .errors() - // .into_iter() - // .map(|e| e.to_owned()) - // .collect::>(), - // ); - - // err_collector.report_raw(); - // println!("res: {:?}", parse_res); + World::new(n); } diff --git a/testfiles/hello.owo b/testfiles/hello.owo new file mode 100644 index 0000000..d72460b --- /dev/null +++ b/testfiles/hello.owo @@ -0,0 +1 @@ +mod meow; diff --git a/testfiles/hello/meow.owo b/testfiles/hello/meow.owo new file mode 100644 index 0000000..643c13a --- /dev/null +++ b/testfiles/hello/meow.owo @@ -0,0 +1,2 @@ +mod mrawr {} +mod mrow {} diff --git a/testfiles/test.owo b/testfiles/test.owo index 4f06140..13bb5e7 100644 --- a/testfiles/test.owo +++ b/testfiles/test.owo @@ -1,11 +1,8 @@ -use hello::meow; - -def hello_world = meow [ 1 2 ]; - -def test - -mod hello { - use gay:;uwu_meow::*; - def meow = uwu; +mod hello; +mod world { + mod meow {} + mod uwu { + mod test {} + mod meow {} + } } - diff --git a/testfiles/uwu.owo b/testfiles/uwu.owo new file mode 100644 index 0000000..1a6b5d1 --- /dev/null +++ b/testfiles/uwu.owo @@ -0,0 +1 @@ +mod meow {} From 7bc603f7e70fc81a1519a7f5aad2c451bbd0b0b3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 5 Jun 2024 21:10:52 +0200 Subject: [PATCH 138/189] lang: module resolvin --- Cargo.lock | 8 +- crates/lang/src/ast.rs | 6 +- crates/lang/src/ast/mod_tree.rs | 281 ++++++++++++++--------------- crates/lang/src/ast/nodes.rs | 2 +- crates/lang/src/ast/source_file.rs | 7 +- 5 files changed, 148 insertions(+), 156 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc9818c..eaa8be7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -850,9 +850,9 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -860,9 +860,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs index 1375694..6ff6b03 100644 --- a/crates/lang/src/ast.rs +++ b/crates/lang/src/ast.rs @@ -1,10 +1,10 @@ -use std::{collections::HashMap, path::PathBuf, sync::Arc}; +use std::{collections::HashMap, path::PathBuf}; use rowan::ast::{AstNode, AstPtr}; use self::{ error::{Error, WorldCreationError}, - mod_tree::{Module, ModuleTree}, + mod_tree::ModuleTree, source_file::SourceFile, }; @@ -42,7 +42,7 @@ impl World { Err(e) => return Err(WorldCreationError::FailedToOpenEntryPoint(entry_point, e)), }; - let (src, mut errors) = SourceFile::parse_from(entry_point.clone(), source); + let (src, mut errors) = SourceFile::parse_from(&entry_point, source); let (module_tree, mut files, new_errors) = ModuleTree::parse_from_main(&entry_point, &src); errors.extend(new_errors); diff --git a/crates/lang/src/ast/mod_tree.rs b/crates/lang/src/ast/mod_tree.rs index 035faec..35df053 100644 --- a/crates/lang/src/ast/mod_tree.rs +++ b/crates/lang/src/ast/mod_tree.rs @@ -1,10 +1,12 @@ use std::{ - collections::{HashMap, HashSet}, - path::PathBuf, + cell::RefCell, + collections::HashMap, + path::{Path, PathBuf}, + rc::Rc, sync::Arc, }; -use rowan::ast::{AstNode, AstPtr}; +use rowan::ast::AstNode; use crate::{lst_parser::syntax_kind::SyntaxKind, SyntaxNode}; @@ -16,7 +18,80 @@ use super::{ }; pub struct ModuleTree { - modules: HashMap>, + modules: Rc>, +} + +#[derive(Clone)] +struct ModuleParsingContext { + files: Rc>>, + errors: Rc>>, + proj_dir: Rc, + cur_path: Vec, + cur_file: PathBuf, +} + +impl ModuleParsingContext { + fn new(entry_path: &Path) -> Self { + let proj_dir = entry_path.parent().unwrap().to_owned(); + Self { + files: Rc::new(RefCell::new(HashMap::new())), + errors: Rc::new(RefCell::new(Vec::new())), + proj_dir: Rc::new(entry_path.to_owned()), + cur_path: Vec::new(), + cur_file: entry_path.to_owned(), + } + } + + fn entry_path(&self) -> PathBuf { + self.proj_dir.to_path_buf() + } + + fn make_mod_file_path(&self, mod_path: &[String], mod_name: &str) -> PathBuf { + let mut entry_path = self.entry_path(); + for el in mod_path { + entry_path.push(format!("{el}/")); + } + entry_path.push(format!("{mod_name}.owo")); + entry_path + } + + fn push_cur_path(&mut self, name_to_add: String) { + self.cur_path.push(name_to_add); + } + + fn set_cur_file(&mut self, new: PathBuf) { + self.cur_file = new; + } + + fn push_errs(&self, errs: Vec) { + self.errors.borrow_mut().extend(errs); + } + + fn parse_child_modules( + &self, + node: &SyntaxNode, + name: Option, + ) -> HashMap { + let mut ctx = self.clone(); + if let Some(name) = name { + ctx.push_cur_path(name) + } + node.children() + .filter_map(Mod::cast) + .filter_map(|m| match Module::parse_mod(m, self.clone()) { + Ok(module) => Some((module.name(), module)), + Err(error) => { + self.errors.borrow_mut().push(error); + None + } + }) + .collect::>() + } + + fn dissolve(self) -> (HashMap, Vec) { + let Self { files, errors, .. } = self; + (files.take(), errors.take()) + } } impl ModuleTree { @@ -24,37 +99,18 @@ impl ModuleTree { path: &PathBuf, main_file: &SourceFile, ) -> (Self, HashMap, Vec) { - let tree = main_file.tree(); - let mut files = HashMap::new(); - let mut errors = Vec::new(); - let entry_path = path.parent().unwrap().to_owned(); - let modules = main_file - .top_level_modules() - .into_iter() - .filter_map(|m| { - let module = - Module::parse_mod(m.to_node(tree.syntax()), Vec::new(), &path, &entry_path); - match module { - Ok(module) => { - files.extend(module.1); - errors.extend(module.2); - Some((module.0.name(), Arc::new(module.0))) - } - Err(err) => { - errors.push(err); - None - } - } - }) - .collect::>>(); + let ctx = ModuleParsingContext::new(&entry_path); + let modules = Rc::new(ctx.parse_child_modules(main_file.tree().syntax(), None)); + + let (files, errors) = ctx.dissolve(); (Self { modules }, files, errors) } pub fn print_tree(&self, lst: &Root) { let name = "main"; - print_tree(&name, &self.modules, 0) + print_tree(&name, self.modules.clone(), 0) } } @@ -62,19 +118,12 @@ pub struct Module { path: Vec, name: String, kind: ModuleKind, - children: HashMap>, + children: Rc>, parent: Option>, } impl Module { - fn parse_mod( - module: Mod, - cur_path: Vec, - cur_file: &PathBuf, - entry_path: &PathBuf, - ) -> Result<(Self, HashMap, Vec), Error> { - dbg!(cur_file); - dbg!(entry_path); + fn parse_mod(module: Mod, ctx: ModuleParsingContext) -> Result { let children = module .syntax() .children() @@ -86,138 +135,77 @@ impl Module { assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); return Self::parse_file_mod( name.text().to_string(), - Loc::new(cur_file.clone(), &module), - cur_path, - entry_path, + ctx.clone(), + Loc::new(ctx.cur_file.clone(), &module), ); } else if children.len() == 2 { let name = &children[0]; assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); let body = &children[1]; assert_eq!(body.kind(), SyntaxKind::MODULE_BODY); - return Ok(Self::parse_inline_mod( - module, cur_path, cur_file, entry_path, - )); + return Ok(Self::parse_inline_mod(module, ctx.clone())); } todo!() } fn parse_file_mod( name: String, + mut ctx: ModuleParsingContext, decl: Loc, - mut cur_path: Vec, - entry_path: &PathBuf, - ) -> Result<(Self, HashMap, Vec), Error> { - let mut mod_file_path = entry_path.to_owned(); + ) -> Result { + ctx.set_cur_file(ctx.make_mod_file_path(&ctx.cur_path, &name)); - for el in &cur_path { - mod_file_path.push(format!("{el}/")); - } - mod_file_path.push(format!("{name}.owo")); - - let mut files = HashMap::new(); - let mut errors = Vec::new(); - - let source = match std::fs::read_to_string(dbg!(&mod_file_path)) { + let source = match std::fs::read_to_string(&ctx.cur_file) { Ok(f) => f, - Err(e) => return Err(Error::FailedToOpenFileMod(mod_file_path, e)), + Err(e) => return Err(Error::FailedToOpenFileMod(ctx.cur_file, e)), }; - let (source_file, file_errors) = SourceFile::parse_from(mod_file_path.clone(), source); - errors.extend(file_errors); + let (source_file, file_errors) = SourceFile::parse_from(&ctx.cur_file, source); - let tree = source_file.tree(); - let old_path = cur_path.clone(); - cur_path.push(name.clone()); - let children = source_file - .top_level_modules() - .into_iter() - .filter_map(|m| { - let module = Module::parse_mod( - m.to_node(tree.syntax()), - cur_path.clone(), - &mod_file_path, - &entry_path, - ); - match module { - Ok(module) => { - files.extend(module.1); - errors.extend(module.2); - Some((module.0.name(), Arc::new(module.0))) - } - Err(err) => { - errors.push(err); - None - } - } - }) - .collect::>>(); + let old_path = ctx.cur_path.clone(); + ctx.push_cur_path(name.clone()); + ctx.push_errs(file_errors); - files.insert(mod_file_path.clone(), source_file); + let children = + Rc::new(ctx.parse_child_modules(source_file.tree().syntax(), Some(name.clone()))); - Ok(( - Self { - path: old_path, - name, - kind: ModuleKind::File { - declaration: decl, - file_id: mod_file_path, - }, - children, - parent: None, + ctx.files + .borrow_mut() + .insert(ctx.cur_file.clone(), source_file); + + Ok(Self { + path: old_path, + name, + kind: ModuleKind::File { + declaration: decl, + file_id: ctx.cur_file.clone(), }, - files, - errors, - )) + children, + parent: None, + }) } - fn parse_inline_mod( - module: Mod, - mut cur_path: Vec, - cur_file: &PathBuf, - entry_path: &PathBuf, - ) -> (Self, HashMap, Vec) { + fn parse_inline_mod(module: Mod, mut ctx: ModuleParsingContext) -> Self { let mut children = module.syntax().children().collect::>(); let body = ModBody::cast(children.pop().unwrap()).unwrap(); - let name = ModName::cast(children.pop().unwrap()).unwrap(); - - let mut files = HashMap::new(); - let mut errors = Vec::new(); - - let old_path = cur_path.clone(); - cur_path.push(name.syntax().to_string()); - let children = body + let name = ModName::cast(children.pop().unwrap()) + .unwrap() .syntax() - .children() - .filter_map(|node| Mod::cast(node)) - .filter_map(|m| { - let m = Self::parse_mod(m, cur_path.clone(), cur_file, entry_path); - match m { - Ok(module) => { - files.extend(module.1); - errors.extend(module.2); - Some((module.0.name(), Arc::new(module.0))) - } - Err(err) => { - errors.push(err); - None - } - } - }) - .collect::>>(); + .text() + .to_string(); - ( - Self { - name: name.syntax().text().to_string(), - kind: ModuleKind::Inline(Loc::new(cur_file.to_owned(), &module)), - children, - parent: None, - path: old_path, - }, - files, - errors, - ) + let old_path = ctx.cur_path.clone(); + ctx.push_cur_path(name.clone()); + let children = Rc::new(ctx.parse_child_modules(body.syntax(), Some(name.clone()))); + + Self { + name, + kind: ModuleKind::Inline(Loc::new(ctx.cur_file.to_owned(), &module)), + children, + parent: None, + path: old_path, + } } pub fn name(&self) -> String { @@ -226,7 +214,7 @@ impl Module { } } -fn print_tree(name: &str, children: &HashMap>, level: u32) { +fn print_tree(name: &str, children: Rc>, level: u32) { const INDENT_STR: &str = " "; for _ in 0..level { @@ -234,9 +222,12 @@ fn print_tree(name: &str, children: &HashMap>, level: u32) { } print!("{name}\n"); - for (name, module) in children { - print_tree(name, &module.children, level + 1); - } + // for (name, module) in children.iter() { + // ; + // } + children + .iter() + .for_each(|(name, m)| print_tree(name, m.children.clone(), level + 1)) } enum ModuleKind { diff --git a/crates/lang/src/ast/nodes.rs b/crates/lang/src/ast/nodes.rs index e59c0f3..744596e 100644 --- a/crates/lang/src/ast/nodes.rs +++ b/crates/lang/src/ast/nodes.rs @@ -4,7 +4,7 @@ use rowan::Language; macro_rules! ast_nodes { ($($ast:ident, $kind:ident);+) => { $( - #[derive(PartialEq, Eq, Hash)] + #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct $ast(SyntaxNode); impl rowan::ast::AstNode for $ast { diff --git a/crates/lang/src/ast/source_file.rs b/crates/lang/src/ast/source_file.rs index e6e33be..912decd 100644 --- a/crates/lang/src/ast/source_file.rs +++ b/crates/lang/src/ast/source_file.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use rowan::ast::{AstNode, AstPtr}; @@ -15,6 +15,7 @@ use super::{ nodes::{Def, Mod, Root, Use}, }; +#[derive(Debug)] pub struct SourceFile { lst: Root, modules: Vec>, @@ -23,7 +24,7 @@ pub struct SourceFile { } impl SourceFile { - pub fn parse_from(path: PathBuf, source_text: String) -> (Self, Vec) { + pub fn parse_from(path: &Path, source_text: String) -> (Self, Vec) { let toks = syntax_kind::lex(&source_text); let input = Input::new(&toks); let mut parser = Parser::new(input); @@ -57,7 +58,7 @@ impl SourceFile { }, out.errors() .into_iter() - .map(|err| Error::from_syntax(path.clone(), err)) + .map(|err| Error::from_syntax(path.to_owned(), err)) .collect(), ) } From 1a533eb788c914edb97eae9a7af972207f2876c7 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 6 Jun 2024 09:53:28 +0200 Subject: [PATCH 139/189] lang: smol module tree things and details --- crates/lang/src/ast.rs | 7 ------- crates/lang/src/ast/mod_tree.rs | 14 +++++++------- testfiles/hello.owo | 2 ++ testfiles/hello/meow.owo | 4 +++- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs index 6ff6b03..3bbb2f1 100644 --- a/crates/lang/src/ast.rs +++ b/crates/lang/src/ast.rs @@ -58,11 +58,4 @@ impl World { module_tree, }) } - - // fn parse_mod_tree(files: &mut HashMap) } - -// struct SourceFile { -// tree: SyntaxNode, -// items: Vec, -// } diff --git a/crates/lang/src/ast/mod_tree.rs b/crates/lang/src/ast/mod_tree.rs index 35df053..8cc373f 100644 --- a/crates/lang/src/ast/mod_tree.rs +++ b/crates/lang/src/ast/mod_tree.rs @@ -18,7 +18,7 @@ use super::{ }; pub struct ModuleTree { - modules: Rc>, + modules: Rc>>, } #[derive(Clone)] @@ -71,7 +71,7 @@ impl ModuleParsingContext { &self, node: &SyntaxNode, name: Option, - ) -> HashMap { + ) -> HashMap> { let mut ctx = self.clone(); if let Some(name) = name { ctx.push_cur_path(name) @@ -79,13 +79,13 @@ impl ModuleParsingContext { node.children() .filter_map(Mod::cast) .filter_map(|m| match Module::parse_mod(m, self.clone()) { - Ok(module) => Some((module.name(), module)), + Ok(module) => Some((module.name(), Rc::new(module))), Err(error) => { self.errors.borrow_mut().push(error); None } }) - .collect::>() + .collect::>>() } fn dissolve(self) -> (HashMap, Vec) { @@ -118,8 +118,8 @@ pub struct Module { path: Vec, name: String, kind: ModuleKind, - children: Rc>, - parent: Option>, + children: Rc>>, + parent: Option>, } impl Module { @@ -214,7 +214,7 @@ impl Module { } } -fn print_tree(name: &str, children: Rc>, level: u32) { +fn print_tree(name: &str, children: Rc>>, level: u32) { const INDENT_STR: &str = " "; for _ in 0..level { diff --git a/testfiles/hello.owo b/testfiles/hello.owo index d72460b..f2fe209 100644 --- a/testfiles/hello.owo +++ b/testfiles/hello.owo @@ -1 +1,3 @@ mod meow; + +def broken diff --git a/testfiles/hello/meow.owo b/testfiles/hello/meow.owo index 643c13a..3140a4a 100644 --- a/testfiles/hello/meow.owo +++ b/testfiles/hello/meow.owo @@ -1,2 +1,4 @@ mod mrawr {} -mod mrow {} +mod mrow { + def gay = ; +} From 3e2c5946c8e03745ffb1d31d97ddeeb168cee442 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 6 Jun 2024 12:59:30 +0200 Subject: [PATCH 140/189] lang: add registry/namespace --- crates/lang/src/ast.rs | 13 ++- crates/lang/src/ast/mod_tree.rs | 68 +++++++++++++--- crates/lang/src/ast/namespace.rs | 103 ++++++++++++++++++++++++ crates/lang/src/ast/path.rs | 94 +++++++++++++++++++++ testfiles/{ => testproj}/hello.owo | 0 testfiles/{ => testproj}/hello/meow.owo | 0 testfiles/{ => testproj}/test.owo | 0 testfiles/{ => testproj}/uwu.owo | 0 8 files changed, 264 insertions(+), 14 deletions(-) create mode 100644 crates/lang/src/ast/namespace.rs create mode 100644 crates/lang/src/ast/path.rs rename testfiles/{ => testproj}/hello.owo (100%) rename testfiles/{ => testproj}/hello/meow.owo (100%) rename testfiles/{ => testproj}/test.owo (100%) rename testfiles/{ => testproj}/uwu.owo (100%) diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs index 3bbb2f1..0c63620 100644 --- a/crates/lang/src/ast.rs +++ b/crates/lang/src/ast.rs @@ -5,14 +5,18 @@ use rowan::ast::{AstNode, AstPtr}; use self::{ error::{Error, WorldCreationError}, mod_tree::ModuleTree, + namespace::Registry, source_file::SourceFile, }; mod error; mod mod_tree; +mod namespace; mod nodes; +mod path; mod source_file; +#[derive(Debug)] struct Loc { file: PathBuf, syntax_el: AstPtr, @@ -25,6 +29,10 @@ impl Loc { syntax_el: AstPtr::new(syntax_el), } } + + pub fn file(&self) -> &PathBuf { + &self.file + } } pub struct World { @@ -32,6 +40,7 @@ pub struct World { files: HashMap, errors: Vec, module_tree: ModuleTree, + registry: Registry, } impl World { @@ -44,7 +53,8 @@ impl World { let (src, mut errors) = SourceFile::parse_from(&entry_point, source); - let (module_tree, mut files, new_errors) = ModuleTree::parse_from_main(&entry_point, &src); + let (module_tree, mut files, new_errors, registry) = + ModuleTree::parse_from_main(&entry_point, &src); errors.extend(new_errors); module_tree.print_tree(&src.tree()); dbg!(&errors); @@ -56,6 +66,7 @@ impl World { entry_point, errors, module_tree, + registry, }) } } diff --git a/crates/lang/src/ast/mod_tree.rs b/crates/lang/src/ast/mod_tree.rs index 8cc373f..2e5e269 100644 --- a/crates/lang/src/ast/mod_tree.rs +++ b/crates/lang/src/ast/mod_tree.rs @@ -6,13 +6,15 @@ use std::{ sync::Arc, }; -use rowan::ast::AstNode; +use rowan::ast::{AstNode, SyntaxNodePtr}; -use crate::{lst_parser::syntax_kind::SyntaxKind, SyntaxNode}; +use crate::{lst_parser::syntax_kind::SyntaxKind, Lang, SyntaxNode}; use super::{ error::Error, + namespace::Registry, nodes::{self, Mod, ModBody, ModName, Root}, + path::{ItemPath, OwnedItemPath}, source_file::SourceFile, Loc, }; @@ -25,6 +27,7 @@ pub struct ModuleTree { struct ModuleParsingContext { files: Rc>>, errors: Rc>>, + reg: Rc>, proj_dir: Rc, cur_path: Vec, cur_file: PathBuf, @@ -36,6 +39,7 @@ impl ModuleParsingContext { Self { files: Rc::new(RefCell::new(HashMap::new())), errors: Rc::new(RefCell::new(Vec::new())), + reg: Rc::new(RefCell::new(Registry::new())), proj_dir: Rc::new(entry_path.to_owned()), cur_path: Vec::new(), cur_file: entry_path.to_owned(), @@ -79,7 +83,7 @@ impl ModuleParsingContext { node.children() .filter_map(Mod::cast) .filter_map(|m| match Module::parse_mod(m, self.clone()) { - Ok(module) => Some((module.name(), Rc::new(module))), + Ok(module) => Some((module.name(), module)), Err(error) => { self.errors.borrow_mut().push(error); None @@ -88,9 +92,14 @@ impl ModuleParsingContext { .collect::>>() } - fn dissolve(self) -> (HashMap, Vec) { - let Self { files, errors, .. } = self; - (files.take(), errors.take()) + fn dissolve(self) -> (HashMap, Vec, Registry) { + let Self { + files, + errors, + mut reg, + .. + } = self; + (files.take(), errors.take(), (&*reg).take()) } } @@ -98,14 +107,14 @@ impl ModuleTree { pub fn parse_from_main( path: &PathBuf, main_file: &SourceFile, - ) -> (Self, HashMap, Vec) { + ) -> (Self, HashMap, Vec, Registry) { let entry_path = path.parent().unwrap().to_owned(); let ctx = ModuleParsingContext::new(&entry_path); let modules = Rc::new(ctx.parse_child_modules(main_file.tree().syntax(), None)); - let (files, errors) = ctx.dissolve(); - (Self { modules }, files, errors) + let (files, errors, reg) = ctx.dissolve(); + (Self { modules }, files, errors, reg) } pub fn print_tree(&self, lst: &Root) { @@ -114,26 +123,29 @@ impl ModuleTree { } } +#[derive(Debug)] pub struct Module { path: Vec, name: String, kind: ModuleKind, children: Rc>>, parent: Option>, + body: SyntaxNodePtr, } impl Module { - fn parse_mod(module: Mod, ctx: ModuleParsingContext) -> Result { + fn parse_mod(module: Mod, mut ctx: ModuleParsingContext) -> Result, Error> { let children = module .syntax() .children() // .map(|n| n.kind()) .collect::>(); + let r; if children.len() == 1 { let name = &children[0]; assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); - return Self::parse_file_mod( + r = Self::parse_file_mod( name.text().to_string(), ctx.clone(), Loc::new(ctx.cur_file.clone(), &module), @@ -143,9 +155,15 @@ impl Module { assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); let body = &children[1]; assert_eq!(body.kind(), SyntaxKind::MODULE_BODY); - return Ok(Self::parse_inline_mod(module, ctx.clone())); + r = Ok(Self::parse_inline_mod(module, ctx.clone())); + } else { + unreachable!() } - todo!() + r.map(|module| { + let rc = Rc::new(module); + ctx.reg.borrow_mut().insert_mod(rc.path(), rc.clone()); + rc + }) } fn parse_file_mod( @@ -168,6 +186,7 @@ impl Module { let children = Rc::new(ctx.parse_child_modules(source_file.tree().syntax(), Some(name.clone()))); + let body = SyntaxNodePtr::new(source_file.tree().syntax()); ctx.files .borrow_mut() @@ -182,6 +201,7 @@ impl Module { }, children, parent: None, + body, }) } @@ -205,13 +225,34 @@ impl Module { children, parent: None, path: old_path, + body: SyntaxNodePtr::new(body.syntax()), } } + pub fn path(&self) -> ItemPath { + let mut p = self.path.clone(); + p.push(self.name()); + let mut r_p = ItemPath::new(); + for i in p { + r_p = r_p.push(i); + } + r_p + } + pub fn name(&self) -> String { // self.name.to_node(lst.syntax()).syntax().text().to_string() self.name.clone() } + + pub fn body(&self, files: &HashMap) -> SyntaxNode { + match &self.kind { + ModuleKind::Inline(l) => { + let file = files.get(l.file()).unwrap(); + self.body.to_node(file.tree().syntax()) + } + ModuleKind::File { file_id, .. } => files.get(file_id).unwrap().tree().syntax().clone(), + } + } } fn print_tree(name: &str, children: Rc>>, level: u32) { @@ -230,6 +271,7 @@ fn print_tree(name: &str, children: Rc>>, level: u32) .for_each(|(name, m)| print_tree(name, m.children.clone(), level + 1)) } +#[derive(Debug)] enum ModuleKind { Inline(Loc), File { diff --git a/crates/lang/src/ast/namespace.rs b/crates/lang/src/ast/namespace.rs new file mode 100644 index 0000000..014a6c8 --- /dev/null +++ b/crates/lang/src/ast/namespace.rs @@ -0,0 +1,103 @@ +use std::{ + cell::RefCell, + collections::{HashMap, HashSet}, + rc::Rc, +}; + +use super::{ + mod_tree::Module, + nodes, + path::{ItemPath, OwnedItemPath}, +}; + +// requires mappings: +// names -> sets of references to individual objects +// paths -> individual objects +// glob paths -> sets of object refs +// (OPT/LATER) names (fuzzy) ~> sets of objects +#[derive(Debug)] +pub struct Registry { + defs: Vec>, + mods: Vec>, + names: HashMap>, + paths: HashMap, +} + +impl Registry { + pub fn new() -> Self { + Self { + defs: Vec::new(), + mods: Vec::new(), + names: HashMap::new(), + paths: HashMap::new(), + } + } + + // TODO: rewrite. has lots of flaws + pub fn insert_mod(&mut self, path: ItemPath<'_>, module: Rc) -> Option { + let idx = self.mods.len(); + let Some(name) = path.name() else { return None }; + self.mods.push(StoreObj::new(&name, Mod { module })); + + if let Some(set) = self.names.get_mut(&name) { + set.insert(RegistryIdx::Mod(idx)); + } else { + self.names + .insert(name, HashSet::from([RegistryIdx::Mod(idx)])); + } + + if self + .paths + .get(&path.clone().into()) + .is_some_and(|other_idx| *other_idx != RegistryIdx::Mod(idx)) + { + return None; + } else { + self.paths.insert(path.into(), RegistryIdx::Mod(idx)) + } + } +} + +impl Default for Registry { + fn default() -> Self { + Self::new() + } +} + +#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)] +pub enum RegistryIdx { + Def(usize), + Mod(usize), +} + +#[derive(Debug)] +struct StoreObj { + inner: Rc>, +} + +impl StoreObj { + pub fn new(name: impl ToString, item: T) -> Self { + Self { + inner: Rc::new(InnerStoreObj { + name: name.to_string(), + obj: item, + }), + } + } +} + +#[derive(Debug)] +struct InnerStoreObj { + name: String, + obj: T, +} + +#[derive(Debug)] +struct Mod { + module: Rc, +} + +#[derive(Debug)] +struct Def { + node: nodes::Def, +} diff --git a/crates/lang/src/ast/path.rs b/crates/lang/src/ast/path.rs new file mode 100644 index 0000000..a15f141 --- /dev/null +++ b/crates/lang/src/ast/path.rs @@ -0,0 +1,94 @@ +use std::borrow::Cow; + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct ItemPath<'a> { + items: Vec>, +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub struct OwnedItemPath { + items: Vec, +} + +impl OwnedItemPath { + pub fn name(&self) -> Option { + self.items.last().cloned() + } +} + +impl From> for OwnedItemPath { + fn from(value: ItemPath<'_>) -> Self { + Self { + items: value + .items + .into_iter() + .map(|v| v.into_owned()) + .collect::>(), + } + } +} + +impl<'a> ItemPath<'a> { + pub fn new() -> Self { + Self { items: Vec::new() } + } + + pub fn from_slices(slice: &[&'a str]) -> Self { + Self { + items: slice.into_iter().map(|i| (*i).into()).collect::>(), + } + } + + pub fn push(mut self, item: impl Into>) -> Self { + self.items.push(item.into()); + self + } + + pub fn name(&self) -> Option { + self.items.last().cloned().map(|item| item.into_owned()) + } +} + +impl<'a> TryFrom> for ItemPath<'a> { + type Error = (); + + fn try_from(value: Pattern<'a>) -> Result { + let mut items = Vec::new(); + + for i in value.items { + match i { + PatternEl::Name(n) => items.push(n), + PatternEl::Glob => return Err(()), + } + } + + Ok(Self { items }) + } +} + +#[derive(Clone, Debug)] +pub struct Pattern<'a> { + items: Vec>, +} + +impl<'a> Pattern<'a> { + pub fn new() -> Self { + Self { items: Vec::new() } + } + + pub fn add_name(mut self, name: &'a str) -> Self { + self.items.push(PatternEl::Name(name.into())); + self + } + + pub fn add_glob(mut self) -> Self { + self.items.push(PatternEl::Glob); + self + } +} + +#[derive(Clone, Debug)] +enum PatternEl<'a> { + Name(Cow<'a, str>), + Glob, +} diff --git a/testfiles/hello.owo b/testfiles/testproj/hello.owo similarity index 100% rename from testfiles/hello.owo rename to testfiles/testproj/hello.owo diff --git a/testfiles/hello/meow.owo b/testfiles/testproj/hello/meow.owo similarity index 100% rename from testfiles/hello/meow.owo rename to testfiles/testproj/hello/meow.owo diff --git a/testfiles/test.owo b/testfiles/testproj/test.owo similarity index 100% rename from testfiles/test.owo rename to testfiles/testproj/test.owo diff --git a/testfiles/uwu.owo b/testfiles/testproj/uwu.owo similarity index 100% rename from testfiles/uwu.owo rename to testfiles/testproj/uwu.owo From 37651a83bc7db9ec5cebf98be1d8c45ee8bab9f0 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 10 Jun 2024 09:47:48 +0200 Subject: [PATCH 141/189] lang: current state idk try to parallelize --- Cargo.lock | 91 ++++++++++++++- crates/lang/Cargo.toml | 3 + crates/lang/src/lib.rs | 7 +- crates/lang/src/main.rs | 18 +-- crates/lang/src/world.rs | 47 ++++++++ crates/lang/src/world/error.rs | 17 +++ crates/lang/src/world/files.rs | 116 +++++++++++++++++++ crates/lang/src/world/modules.rs | 38 ++++++ crates/lang/src/world/nodes.rs | 77 ++++++++++++ crates/lang/src/world/registry.rs | 41 +++++++ crates/lang/src/world/world_creation_pool.rs | 82 +++++++++++++ 11 files changed, 522 insertions(+), 15 deletions(-) create mode 100644 crates/lang/src/world.rs create mode 100644 crates/lang/src/world/error.rs create mode 100644 crates/lang/src/world/files.rs create mode 100644 crates/lang/src/world/modules.rs create mode 100644 crates/lang/src/world/nodes.rs create mode 100644 crates/lang/src/world/registry.rs create mode 100644 crates/lang/src/world/world_creation_pool.rs diff --git a/Cargo.lock b/Cargo.lock index eaa8be7..cd7e5fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -206,6 +206,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.4" @@ -228,6 +250,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.18" @@ -286,6 +317,19 @@ dependencies = [ "syn", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "deranged" version = "0.3.11" @@ -563,12 +607,15 @@ version = "0.1.0" dependencies = [ "ariadne", "clap", + "crossbeam", + "dashmap", "drop_bomb", "ego-tree", "enumset", "indexmap", "indoc", "logos", + "num_cpus", "owo-colors", "petgraph", "rowan", @@ -588,9 +635,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" @@ -600,7 +647,7 @@ checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ "bitflags 2.4.1", "libc", - "redox_syscall", + "redox_syscall 0.4.1", ] [[package]] @@ -701,6 +748,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -710,6 +767,12 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + [[package]] name = "option-ext" version = "0.2.0" @@ -725,6 +788,19 @@ dependencies = [ "supports-color", ] +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.1", + "smallvec", + "windows-targets 0.52.0", +] + [[package]] name = "petgraph" version = "0.6.4" @@ -877,6 +953,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.4.1", +] + [[package]] name = "redox_users" version = "0.4.4" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 8a9c80b..0323c98 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -16,6 +16,9 @@ rowan = "0.15.15" drop_bomb = "0.1.5" enumset = "1.1.3" indoc = "2" +num_cpus = "1.16" +dashmap = "5.5.3" +crossbeam = "0.8.4" owo-colors = {version = "4", features = ["supports-colors"]} [lints] diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index d700d45..c8b48f6 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -2,6 +2,10 @@ use crate::lst_parser::syntax_kind::SyntaxKind; +pub mod ast; +pub mod lst_parser; +pub mod world; + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Lang {} impl rowan::Language for Lang { @@ -19,6 +23,3 @@ impl rowan::Language for Lang { pub type SyntaxNode = rowan::SyntaxNode; pub type SyntaxToken = rowan::SyntaxNode; pub type SyntaxElement = rowan::NodeOrToken; - -pub mod ast; -pub mod lst_parser; diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index 1dbd527..c0c04d5 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -15,18 +15,18 @@ struct Args { fn main() { let args = Args::parse(); let n = args.file.clone(); - // let f = fs::read_to_string(n.clone()).expect("failed to read file"); + let f = fs::read_to_string(n.clone()).expect("failed to read file"); - // let toks = dbg!(syntax_kind::lex(&f)); - // let input = input::Input::new(&toks); - // let mut parser = lst_parser::Parser::new(input); + let toks = dbg!(syntax_kind::lex(&f)); + let input = input::Input::new(&toks); + let mut parser = lst_parser::Parser::new(input); - // grammar::source_file(&mut parser); + grammar::source_file(&mut parser); - // let p_out = dbg!(parser.finish()); - // let o = Output::from_parser_output(toks, p_out); + let p_out = dbg!(parser.finish()); + let o = Output::from_parser_output(toks, p_out); - // println!("{}", o.debug_colored()); + println!("{}", o.debug_colored()); - World::new(n); + // World::new(n); } diff --git a/crates/lang/src/world.rs b/crates/lang/src/world.rs new file mode 100644 index 0000000..8a2506b --- /dev/null +++ b/crates/lang/src/world.rs @@ -0,0 +1,47 @@ +use std::{ + fmt::Display, + path::{Path, PathBuf}, +}; + +use crate::world::world_creation_pool::WorldCreationPool; + +use self::{files::Files, registry::Registry}; + +pub mod error; +pub mod files; +pub mod modules; +pub mod nodes; +pub mod registry; +mod world_creation_pool; + +pub struct World {} + +impl World { + pub fn new(entry_point: &Path) -> Result { + let files = Files::new(); + let reg = Registry::new(); + + let (entry_point_id, errors) = files.add_and_parse(entry_point).map_err(|e| { + WorldCreationError::FailedToOpenEntryPoint(entry_point.to_path_buf(), e) + })?; + + let pool = WorldCreationPool::new(files, reg); + + todo!() + } +} + +#[derive(Debug)] +pub enum WorldCreationError { + FailedToOpenEntryPoint(PathBuf, std::io::Error), +} + +impl Display for WorldCreationError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + WorldCreationError::FailedToOpenEntryPoint(entry_path, e) => { + write!(f, "failed to open entry_point '{entry_path:?}': {e}") + } + } + } +} diff --git a/crates/lang/src/world/error.rs b/crates/lang/src/world/error.rs new file mode 100644 index 0000000..6232a68 --- /dev/null +++ b/crates/lang/src/world/error.rs @@ -0,0 +1,17 @@ +use std::path::PathBuf; + +use crate::lst_parser::error::SyntaxError; + +use super::files::FileId; + +#[derive(Debug)] +pub enum Error { + Syntax(FileId, SyntaxError), + FailedToOpenFileMod(PathBuf, std::io::Error), +} + +impl Error { + pub fn from_syntax(file: FileId, e: SyntaxError) -> Self { + Self::Syntax(file, e) + } +} diff --git a/crates/lang/src/world/files.rs b/crates/lang/src/world/files.rs new file mode 100644 index 0000000..ca61d83 --- /dev/null +++ b/crates/lang/src/world/files.rs @@ -0,0 +1,116 @@ +use std::{ + clone, fs, + path::{Path, PathBuf}, + sync::{Arc, Mutex, RwLock}, +}; + +use dashmap::DashMap; +use rowan::ast::{AstNode, AstPtr}; + +use crate::lst_parser::{ + error::SyntaxError, grammar::source_file, input::Input, output::Output, syntax_kind, Parser, +}; + +use super::{error::Error, modules::Module, nodes}; + +pub struct Loc { + file: FileId, + syntax: AstPtr, +} + +#[derive(Clone)] +pub struct Files(Arc); + +impl Files { + pub fn new() -> Self { + Self(Arc::new(FilesInner::new())) + } + + pub fn add_and_parse(&self, file: &Path) -> Result<(FileId, Vec), std::io::Error> { + self.0.add_and_parse(file) + } + + pub fn get(&self, id: FileId) -> Arc { + self.0.get(id) + } +} + +/// global file store +/// contains all known files etc. +struct FilesInner { + paths: Mutex>, + store: DashMap>, +} + +impl FilesInner { + fn new() -> Self { + Self { + paths: Mutex::new(Vec::new()), + store: DashMap::new(), + } + } + + fn add_and_parse(&self, path: &Path) -> Result<(FileId, Vec), std::io::Error> { + let (file, errors) = SourceFile::read_and_parse(&path)?; + + // add file to paths and unlock again + let id = { + let path = path.clone(); + let mut paths = self.paths.lock().unwrap(); + let r = paths.len(); + paths.push(path.to_path_buf()); + FileId(r) + }; + + let _ = self.store.insert(path.to_path_buf(), Arc::new(file)); + + Ok(( + id, + errors + .into_iter() + .map(|e| Error::from_syntax(id, e)) + .collect(), + )) + } + + fn get(&self, id: FileId) -> Arc { + let path = { + let paths = self.paths.lock().unwrap(); + paths[id.0].clone() + }; + + self.store.get(&path).unwrap().clone() + } +} + +pub struct SourceFile { + pub lst: Mutex, + root_module: Option>, +} + +impl SourceFile { + fn read_and_parse(path: &Path) -> Result<(Self, Vec), std::io::Error> { + let source_text = fs::read_to_string(&path)?; + + let toks = syntax_kind::lex(&source_text); + let input = Input::new(&toks); + let mut parser = Parser::new(input); + + source_file(&mut parser); + + let events = parser.finish(); + let out = Output::from_parser_output(toks, events); + let lst = out.syntax(); + + Ok(( + Self { + lst: Mutex::new(nodes::Root::cast(lst).unwrap()), + root_module: None, + }, + out.errors(), + )) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct FileId(pub usize); diff --git a/crates/lang/src/world/modules.rs b/crates/lang/src/world/modules.rs new file mode 100644 index 0000000..0f6d060 --- /dev/null +++ b/crates/lang/src/world/modules.rs @@ -0,0 +1,38 @@ +use std::sync::Arc; + +use dashmap::{DashMap, DashSet}; +use rowan::ast::AstNode; + +use super::{ + files::{FileId, Loc}, + nodes, + registry::ItemPath, + world_creation_pool::WorkerCtx, + // world_creation_pool::WorkerCtx, +}; + +pub struct Module { + /// is none if this is the root module of the entry point file + decl: Option>, + body: ModuleBody, + own_path: ItemPath, + child_modules: Arc>>, + child_defs: Arc>, +} + +impl Module { + pub fn parse_file(ctx: WorkerCtx, file: FileId, decl: Option>) { + let f = ctx.files.get(file); + + let tree = f.lst.lock().unwrap(); + + let children = (&*tree).syntax().children(); + } +} + +struct Def; + +enum ModuleBody { + InLine(Loc), + File(FileId), +} diff --git a/crates/lang/src/world/nodes.rs b/crates/lang/src/world/nodes.rs new file mode 100644 index 0000000..c77399a --- /dev/null +++ b/crates/lang/src/world/nodes.rs @@ -0,0 +1,77 @@ +use crate::lst_parser::syntax_kind::SyntaxKind::*; +use crate::SyntaxNode; +use rowan::Language; +macro_rules! ast_nodes { +($($ast:ident, $kind:ident);+) => { + $( + #[derive(Debug, PartialEq, Eq, Hash)] + #[repr(transparent)] + pub struct $ast(SyntaxNode); + impl rowan::ast::AstNode for $ast { + type Language = crate::Lang; + + fn can_cast(kind: ::Kind) -> bool { + kind == $kind + } + + fn cast(node: SyntaxNode) -> Option { + if node.kind() == $kind { + Some(Self(node)) + } else { + None + } + } + + fn syntax(&self) -> &SyntaxNode { + &self.0 + } + } + )+ +}; +} +ast_nodes!( + Def, DEF; + DefName, DEF_NAME; + DefBody, DEF_BODY; + + Mod, MODULE; + ModName, MODULE_NAME; + ModBody, MODULE_BODY; + + Use, USE; + UsePat, USE_PAT; + PatItem, PAT_ITEM; + PatGlob, PAT_GLOB; + PatGroup, PAT_GROUP; + + Literal, LITERAL; + IntLit, INT_NUM; + FloatLit, FLOAT_NUM; + StringLit, STRING; + + Matrix, MATRIX; + MatrixRow, MAT_ROW; + Vector, VEC; + List, LIST; + CollectionItem, COLLECTION_ITEM; + + ParenthesizedExpr, PARENTHESIZED_EXPR; + Expression, EXPR; + + Pipeline, PIPELINE; + + Instruction, INSTR; + InstructionName, INSTR_NAME; + InstructionParams, INSTR_PARAMS; + + AttributeSet, ATTR_SET; + Attribute, ATTR; + AttributeName, ATTR_NAME; + AttributeValue, ATTR_VALUE; + + ParseError, PARSE_ERR; + LexError, LEX_ERR; + + Root, ROOT; + Eof, EOF +); diff --git a/crates/lang/src/world/registry.rs b/crates/lang/src/world/registry.rs new file mode 100644 index 0000000..791be15 --- /dev/null +++ b/crates/lang/src/world/registry.rs @@ -0,0 +1,41 @@ +use std::sync::{Arc, Mutex, RwLock}; + +use dashmap::{DashMap, DashSet}; + +use super::modules::Module; + +pub type ItemPath = Vec; + +#[derive(Clone)] +pub struct Registry(Arc); + +impl Registry { + pub fn new() -> Self { + Self(Arc::new(RegistryInner::new())) + } +} + +struct RegistryInner { + /// ids will refer to paths of modules + paths: RwLock>, + modules: DashMap>, + names: DashMap>, +} + +impl RegistryInner { + fn new() -> Self { + Self { + paths: RwLock::new(Vec::new()), + modules: DashMap::new(), + names: DashMap::new(), + } + } +} + +pub enum RegistryId { + /// refer to the modlue item itself, the name must be the same as the last item of the path + Module(usize), + /// refer to a def in a module + /// name must refer to name of child of module + Def(usize), +} diff --git a/crates/lang/src/world/world_creation_pool.rs b/crates/lang/src/world/world_creation_pool.rs new file mode 100644 index 0000000..fd04e65 --- /dev/null +++ b/crates/lang/src/world/world_creation_pool.rs @@ -0,0 +1,82 @@ +use std::{path::PathBuf, thread}; + +use crossbeam::channel::{Receiver, Sender}; + +use super::{ + error::Error, + files::{FileId, Files, Loc}, + nodes, + registry::Registry, +}; + +pub(super) struct WorldCreationPool { + workers: Vec, + tx: Sender, +} + +impl WorldCreationPool { + pub fn new(files: Files, reg: Registry) -> Self { + let mut workers = Vec::new(); + let (tx, rx) = crossbeam::channel::unbounded(); + + for i in 0..num_cpus::get() { + workers.push(Worker::new( + i, + files.clone(), + reg.clone(), + JobSender(tx.clone()), + rx.clone(), + )) + } + + Self { workers, tx } + } +} + +pub struct JobSender(Sender); + +enum Job { + ParseFileMod { + file: FileId, + decl: Option>, + }, + OpenFile(PathBuf), +} + +struct Worker { + id: usize, + // thead: thread::JoinHandle>, + thread: thread::JoinHandle<()>, +} + +pub struct WorkerCtx { + errors: Vec, + pub files: Files, + pub reg: Registry, + pub tx: JobSender, +} + +impl Worker { + fn new(id: usize, files: Files, reg: Registry, sender: JobSender, rx: Receiver) -> Self { + let ctx = WorkerCtx { + errors: Vec::new(), + files, + reg, + tx: sender, + }; + + let thread_handle = thread::spawn(move || { + for msg in rx { + match msg { + Job::ParseFileMod { file, decl } => todo!(), + Job::OpenFile(path) => todo!(), + } + } + }); + + Self { + id, + thread: thread_handle, + } + } +} From 1c6180aabc767332d196bc4ab78624421d94eea9 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 23 Jun 2024 20:32:10 +0200 Subject: [PATCH 142/189] lang: current state for archival purposes --- Cargo.lock | 328 ++++++++++++++++++ crates/lang/Cargo.toml | 3 + crates/lang/src/lib.rs | 2 +- crates/lang/src/lst_parser/output.rs | 5 + crates/lang/src/world.rs | 10 +- crates/lang/src/world/files.rs | 67 ++-- crates/lang/src/world/modules.rs | 157 ++++++++- crates/lang/src/world/nodes.rs | 2 +- crates/lang/src/world/world_creation_pool.rs | 173 +++++++-- .../world/world_creation_pool/wait_blocker.rs | 87 +++++ 10 files changed, 775 insertions(+), 59 deletions(-) create mode 100644 crates/lang/src/world/world_creation_pool/wait_blocker.rs diff --git a/Cargo.lock b/Cargo.lock index cd7e5fc..92c691e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,6 +82,133 @@ dependencies = [ "yansi", ] +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-signal" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -121,6 +248,19 @@ dependencies = [ "serde", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "bytemuck" version = "1.14.0" @@ -191,6 +331,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "countme" version = "3.0.1" @@ -366,6 +515,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1" +[[package]] +name = "easy-parallel" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2afbb9b0aef60e4f0d2b18129b6c0dff035a6f7dbbd17c2f38c1432102ee223c" + [[package]] name = "ego-tree" version = "0.6.2" @@ -405,6 +560,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "eval" version = "0.1.0" @@ -415,6 +580,27 @@ dependencies = [ "serde", ] +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "exr" version = "1.71.0" @@ -431,6 +617,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + [[package]] name = "fdeflate" version = "0.3.3" @@ -471,6 +663,31 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "getrandom" version = "0.2.12" @@ -610,8 +827,10 @@ dependencies = [ "crossbeam", "dashmap", "drop_bomb", + "easy-parallel", "ego-tree", "enumset", + "futures-lite", "indexmap", "indoc", "logos", @@ -619,6 +838,7 @@ dependencies = [ "owo-colors", "petgraph", "rowan", + "smol", ] [[package]] @@ -650,6 +870,12 @@ dependencies = [ "redox_syscall 0.4.1", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lock_api" version = "0.4.11" @@ -788,6 +1014,12 @@ dependencies = [ "supports-color", ] +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot_core" version = "0.9.10" @@ -853,6 +1085,23 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "piper" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "png" version = "0.17.10" @@ -866,6 +1115,21 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1010,6 +1274,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "ryu" version = "1.0.16" @@ -1053,6 +1330,15 @@ dependencies = [ "serde", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -1065,12 +1351,38 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "smol" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", +] + [[package]] name = "spin" version = "0.9.8" @@ -1174,6 +1486,22 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + [[package]] name = "unicode-ident" version = "1.0.12" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index 0323c98..f50073a 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -20,6 +20,9 @@ num_cpus = "1.16" dashmap = "5.5.3" crossbeam = "0.8.4" owo-colors = {version = "4", features = ["supports-colors"]} +smol = "2" +futures-lite = "2.3" +easy-parallel = "3.3.1" [lints] workspace = true diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index c8b48f6..f48385e 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(type_alias_impl_trait, lint_reasons)] +#![feature(type_alias_impl_trait, lint_reasons, box_into_inner)] use crate::lst_parser::syntax_kind::SyntaxKind; diff --git a/crates/lang/src/lst_parser/output.rs b/crates/lang/src/lst_parser/output.rs index af483ab..ce96fb5 100644 --- a/crates/lang/src/lst_parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -209,4 +209,9 @@ impl Output { pub fn errors(&self) -> Vec { self.errors.clone() } + + pub fn dissolve(self) -> (GreenNode, Vec) { + let Self { green_node, errors } = self; + (green_node, errors) + } } diff --git a/crates/lang/src/world.rs b/crates/lang/src/world.rs index 8a2506b..2f32cab 100644 --- a/crates/lang/src/world.rs +++ b/crates/lang/src/world.rs @@ -1,11 +1,19 @@ use std::{ fmt::Display, path::{Path, PathBuf}, + sync::{Arc, Mutex}, }; use crate::world::world_creation_pool::WorldCreationPool; -use self::{files::Files, registry::Registry}; +use easy_parallel::Parallel; +use futures_lite::future; +use smol::{ + channel::{unbounded, Sender}, + Executor, +}; + +use self::{error::Error, files::Files, registry::Registry}; pub mod error; pub mod files; diff --git a/crates/lang/src/world/files.rs b/crates/lang/src/world/files.rs index ca61d83..b4a1309 100644 --- a/crates/lang/src/world/files.rs +++ b/crates/lang/src/world/files.rs @@ -7,50 +7,55 @@ use std::{ use dashmap::DashMap; use rowan::ast::{AstNode, AstPtr}; -use crate::lst_parser::{ - error::SyntaxError, grammar::source_file, input::Input, output::Output, syntax_kind, Parser, +use crate::{ + lst_parser::{ + error::SyntaxError, grammar::source_file, input::Input, output::Output, syntax_kind, Parser, + }, + Lang, }; use super::{error::Error, modules::Module, nodes}; -pub struct Loc { +#[derive(Clone)] +pub struct Loc> { file: FileId, syntax: AstPtr, } -#[derive(Clone)] -pub struct Files(Arc); - -impl Files { - pub fn new() -> Self { - Self(Arc::new(FilesInner::new())) +impl> Loc { + pub fn new(node: N, file: FileId) -> Self { + Self { + file, + syntax: AstPtr::new(&node), + } } - pub fn add_and_parse(&self, file: &Path) -> Result<(FileId, Vec), std::io::Error> { - self.0.add_and_parse(file) + pub fn file(&self) -> FileId { + self.file } - pub fn get(&self, id: FileId) -> Arc { - self.0.get(id) + pub fn syntax(&self) -> AstPtr { + self.syntax.clone() } } /// global file store /// contains all known files etc. -struct FilesInner { - paths: Mutex>, - store: DashMap>, +#[derive(Clone)] +pub struct Files { + paths: Arc>>, + store: Arc>>, } -impl FilesInner { - fn new() -> Self { +impl Files { + pub fn new() -> Self { Self { - paths: Mutex::new(Vec::new()), - store: DashMap::new(), + paths: Arc::new(Mutex::new(Vec::new())), + store: Arc::new(DashMap::new()), } } - fn add_and_parse(&self, path: &Path) -> Result<(FileId, Vec), std::io::Error> { + pub fn add_and_parse(&self, path: &Path) -> Result<(FileId, Vec), std::io::Error> { let (file, errors) = SourceFile::read_and_parse(&path)?; // add file to paths and unlock again @@ -73,7 +78,7 @@ impl FilesInner { )) } - fn get(&self, id: FileId) -> Arc { + pub fn get(&self, id: FileId) -> Arc { let path = { let paths = self.paths.lock().unwrap(); paths[id.0].clone() @@ -81,10 +86,19 @@ impl FilesInner { self.store.get(&path).unwrap().clone() } + + pub fn get_path(&self, id: FileId) -> PathBuf { + let paths = self.paths.lock().unwrap(); + paths[id.0].clone() + } + + pub fn path_store(&self) -> Arc>> { + self.paths.clone() + } } pub struct SourceFile { - pub lst: Mutex, + pub lst: RwLock, root_module: Option>, } @@ -100,14 +114,15 @@ impl SourceFile { let events = parser.finish(); let out = Output::from_parser_output(toks, events); - let lst = out.syntax(); + // let lst = out.syntax(); + let (lst, errors) = out.dissolve(); Ok(( Self { - lst: Mutex::new(nodes::Root::cast(lst).unwrap()), + lst: RwLock::new(lst), root_module: None, }, - out.errors(), + errors, )) } } diff --git a/crates/lang/src/world/modules.rs b/crates/lang/src/world/modules.rs index 0f6d060..676553b 100644 --- a/crates/lang/src/world/modules.rs +++ b/crates/lang/src/world/modules.rs @@ -1,14 +1,18 @@ -use std::sync::Arc; +use std::{ + string::String, + sync::{Arc, Mutex}, +}; use dashmap::{DashMap, DashSet}; -use rowan::ast::AstNode; +use rowan::ast::{AstNode, AstPtr}; + +use crate::SyntaxNode; use super::{ files::{FileId, Loc}, nodes, registry::ItemPath, - world_creation_pool::WorkerCtx, - // world_creation_pool::WorkerCtx, + world_creation_pool::{wait_blocker::WaitBlocker, Task, WorkerCtx}, }; pub struct Module { @@ -21,18 +25,151 @@ pub struct Module { } impl Module { - pub fn parse_file(ctx: WorkerCtx, file: FileId, decl: Option>) { - let f = ctx.files.get(file); + pub fn parse_mod_body( + ctx: &WorkerCtx, + tree: SyntaxNode, + path: ItemPath, + file: FileId, + ) -> (DashMap>>>>, Vec) { + let children: Vec<(String, Arc>>>, nodes::Mod)> = tree + .children() + .filter_map(|c| nodes::Mod::cast(c)) + .map(|m| { + let name = nodes::ModName::cast(m.syntax().first_child().unwrap()) + .expect("ModName should always be first child of Mod"); + ( + name.syntax().text().to_string(), + Arc::new(Mutex::new(None)), + m, + ) + }) + .collect(); + let retv: DashMap>>>> = children + .iter() + .map(|(name, mod_r, _)| (name.to_owned(), mod_r.clone())) + .collect(); + let tasks = children + .into_iter() + .map(|(name, mod_r, loc)| { + let mut path = path.clone(); + path.push(name); + Task::ParseMod(Loc::new(loc, file), mod_r, path) + }) + .collect::>(); - let tree = f.lst.lock().unwrap(); + (retv, tasks) + } + pub fn parse_file0( + ctx: &mut WorkerCtx, + file: FileId, + path: ItemPath, + decl: Option>, + ) { + let tree = ctx.get_tree(file); - let children = (&*tree).syntax().children(); + let (retv, tasks) = Self::parse_mod_body(ctx, tree, path.clone(), file); + + ctx.send_tasks( + Task::ParseFileMod1 { + file, + decl, + ret: retv.into(), + path, + }, + tasks, + ) + } + + pub fn parse_mod( + ctx: &mut WorkerCtx, + loc: Loc, + path: ItemPath, + ret: Arc>>, + blocker: WaitBlocker, + ) { + let mod_decl = ctx.resolve_loc(loc); + let children = mod_decl.syntax().children().collect::>(); + + if children.len() == 1 { + // TODO: file mod + todo!() + } else if children.len() == 2 { + // inline mod + } + } + + pub fn parse_inline_mod( + ctx: &mut WorkerCtx, + decl: Loc, + path: ItemPath, + ret: Arc>>>, + blocker: WaitBlocker, + ) { + let mod_decl_children = ctx + .resolve_loc(decl.clone()) + .syntax() + .children() + .collect::>(); + + assert_eq!(mod_decl_children.len(), 2); + + let name = nodes::ModName::cast(mod_decl_children[0].clone()).unwrap(); + let body = nodes::ModBody::cast(mod_decl_children[1].clone()).unwrap(); + + let (retv, tasks) = + Self::parse_mod_body(ctx, body.syntax().clone(), path.clone(), decl.file()); + + ctx.send_tasks( + Task::CompleteMod { + ret_self: ret, + body: ModuleBody::Inline(Loc::new(body, decl.file())), + decl: Some(decl), + path, + child_mods: retv.into(), + blocker, + }, + tasks, + ) + } + + pub fn complete_mod( + ctx: &mut WorkerCtx, + decl: Option>, + ret_self: Arc>>>, + body: ModuleBody, + path: ItemPath, + child_mods: Arc>>>>>, + blocker: WaitBlocker, + ) { + assert!(child_mods + .iter() + .all(|item| item.value().lock().unwrap().is_some())); + + let module = Arc::new(Module { + decl, + body, + own_path: path, + child_modules: Arc::new( + Arc::<_>::unwrap_or_clone(child_mods) + .into_iter() + .map(|(name, module)| { + let module = module.lock().unwrap().take().unwrap(); + (name, module) + }) + .collect(), + ), + child_defs: Arc::default(), + }); + + let mut ret_self = ret_self.lock().unwrap(); + *ret_self = Some(module); + drop(blocker); } } struct Def; -enum ModuleBody { - InLine(Loc), +pub enum ModuleBody { + Inline(Loc), File(FileId), } diff --git a/crates/lang/src/world/nodes.rs b/crates/lang/src/world/nodes.rs index c77399a..303a3a1 100644 --- a/crates/lang/src/world/nodes.rs +++ b/crates/lang/src/world/nodes.rs @@ -4,7 +4,7 @@ use rowan::Language; macro_rules! ast_nodes { ($($ast:ident, $kind:ident);+) => { $( - #[derive(Debug, PartialEq, Eq, Hash)] + #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[repr(transparent)] pub struct $ast(SyntaxNode); impl rowan::ast::AstNode for $ast { diff --git a/crates/lang/src/world/world_creation_pool.rs b/crates/lang/src/world/world_creation_pool.rs index fd04e65..651d7eb 100644 --- a/crates/lang/src/world/world_creation_pool.rs +++ b/crates/lang/src/world/world_creation_pool.rs @@ -1,14 +1,28 @@ -use std::{path::PathBuf, thread}; +use std::{ + collections::HashMap, + path::PathBuf, + sync::{Arc, Mutex}, + thread, +}; use crossbeam::channel::{Receiver, Sender}; +use dashmap::DashMap; +use rowan::ast::{AstNode, AstPtr}; + +use crate::{Lang, SyntaxNode}; + +use self::wait_blocker::WaitBlocker; use super::{ error::Error, files::{FileId, Files, Loc}, + modules::{Module, ModuleBody}, nodes, - registry::Registry, + registry::{ItemPath, Registry}, }; +pub mod wait_blocker; + pub(super) struct WorldCreationPool { workers: Vec, tx: Sender, @@ -24,7 +38,7 @@ impl WorldCreationPool { i, files.clone(), reg.clone(), - JobSender(tx.clone()), + tx.clone(), rx.clone(), )) } @@ -33,12 +47,31 @@ impl WorldCreationPool { } } -pub struct JobSender(Sender); - enum Job { - ParseFileMod { + WaitingFor(WaitBlocker, Task), + Awaited(WaitBlocker, Task), +} + +pub enum Task { + ParseMod(Loc, Arc>>>, ItemPath), + ParseFileMod0 { file: FileId, decl: Option>, + path: ItemPath, + }, + ParseFileMod1 { + file: FileId, + decl: Option>, + path: ItemPath, + ret: Arc>>>>>, + }, + CompleteMod { + ret_self: Arc>>>, + decl: Option>, + body: ModuleBody, + path: ItemPath, + child_mods: Arc>>>>>, + blocker: WaitBlocker, }, OpenFile(PathBuf), } @@ -51,26 +84,104 @@ struct Worker { pub struct WorkerCtx { errors: Vec, - pub files: Files, + files: Files, + local_files: HashMap, pub reg: Registry, - pub tx: JobSender, + tx: Sender, +} + +impl WorkerCtx { + pub fn get_tree(&mut self, id: FileId) -> SyntaxNode { + let p = self.files.get_path(id); + if self.local_files.contains_key(&p) { + self.local_files[&p].clone() + } else { + let f = self.files.get(id); + let lst = SyntaxNode::new_root(f.lst.read().unwrap().clone()); + self.local_files.insert(p, lst.clone()); + lst + } + } + + pub fn resolve_loc>(&mut self, loc: Loc) -> N { + let f = self.get_tree(loc.file()); + + loc.syntax().to_node(&f) + } + + pub fn send_tasks(&self, task: Task, dependencies: Vec) { + let blocker = WaitBlocker::new(); + for dep_task in dependencies { + self.tx + .send(Job::Awaited(blocker.clone(), dep_task)) + .unwrap(); + } + self.tx.send(Job::WaitingFor(blocker, task)).unwrap(); + } } impl Worker { - fn new(id: usize, files: Files, reg: Registry, sender: JobSender, rx: Receiver) -> Self { - let ctx = WorkerCtx { - errors: Vec::new(), - files, - reg, - tx: sender, - }; - + fn new(id: usize, files: Files, reg: Registry, sender: Sender, rx: Receiver) -> Self { let thread_handle = thread::spawn(move || { - for msg in rx { - match msg { - Job::ParseFileMod { file, decl } => todo!(), - Job::OpenFile(path) => todo!(), + let ctx = WorkerCtx { + errors: Vec::new(), + local_files: HashMap::new(), + files, + reg, + tx: sender, + }; + + for job in &rx { + // if matches!(job, Job::WithCond(_, _)) { + + // } + match job { + Job::WaitingFor(blocker, task) => { + if blocker.is_ready() { + Self::do_task(&ctx, task, None) + } else if rx.is_empty() { + if let Some(blocker) = + blocker.wait_for(std::time::Duration::from_millis(50)) + { + ctx.tx.send(Job::WaitingFor(blocker, task)).unwrap(); + } else { + Self::do_task(&ctx, task, None) + } + } else { + ctx.tx.send(Job::WaitingFor(blocker, task)).unwrap(); + } + } + Job::Awaited(blocker, task) => { + Self::do_task(&ctx, task, Some(blocker.clone())); + drop(blocker) + } } + + // if let Job::WithCond(blocker, job_inner) = job_msg { + // if blocker.is_ready() { + // job = Box::::into_inner(job_inner); + // } else if rx.is_empty() { + // if let Some(blocker) = + // blocker.wait_for(std::time::Duration::from_millis(50)) + // { + // job = Job::WithCond(blocker, job_inner); + // } else { + // job = Box::::into_inner(job_inner); + // } + // } else { + // job = Job::WithCond(blocker, job_inner); + // } + // } else { + // job = job_msg; + // } + + // match job { + // Job::ParseFileMod { file, decl } => todo!(), + // Job::OpenFile(path) => todo!(), + // Job::WithCond(blocker, job) => { + // ctx.tx.send(Job::WithCond(blocker, job)).unwrap() + // } + // } } }); @@ -79,4 +190,26 @@ impl Worker { thread: thread_handle, } } + + fn do_task(ctx: &WorkerCtx, task: Task, blocker: Option) { + match task { + Task::ParseMod(_, _, _) => todo!(), + Task::ParseFileMod0 { file, decl, path } => todo!(), + Task::ParseFileMod1 { + file, + decl, + path, + ret, + } => todo!(), + Task::CompleteMod { + ret_self, + decl, + body, + path, + child_mods, + blocker, + } => todo!(), + Task::OpenFile(_) => todo!(), + } + } } diff --git a/crates/lang/src/world/world_creation_pool/wait_blocker.rs b/crates/lang/src/world/world_creation_pool/wait_blocker.rs new file mode 100644 index 0000000..2d23d8a --- /dev/null +++ b/crates/lang/src/world/world_creation_pool/wait_blocker.rs @@ -0,0 +1,87 @@ +use std::{ + sync::{Arc, Condvar, Mutex}, + time::Duration, +}; + +/// like a WaitGroup from crossbeam, but can also just check if it's the last one +pub struct WaitBlocker { + inner: Arc, +} + +struct Inner { + waiting: Mutex, + cvar: Condvar, +} + +impl WaitBlocker { + pub fn new() -> Self { + Self { + inner: Arc::new(Inner { + waiting: Mutex::new(1), + cvar: Condvar::new(), + }), + } + } + + pub fn wait(self) { + if *self.inner.waiting.lock().unwrap() == 1 { + return; + } + + let inner = self.inner.clone(); + drop(self); + + inner + .cvar + .wait_while(inner.waiting.lock().unwrap(), |w| *w > 0); + } + + pub fn wait_for(self, dur: Duration) -> Option { + if *self.inner.waiting.lock().unwrap() == 1 { + return None; + } + + let inner = self.inner.clone(); + drop(self); + + let (_, timeout_res) = inner + .cvar + .wait_timeout_while(inner.waiting.lock().unwrap(), dur, |w| *w > 0) + .unwrap(); + + if timeout_res.timed_out() { + None + } else { + { + let mut w = inner.waiting.lock().unwrap(); + *w += 1; + } + Some(Self { inner }) + } + } + + pub fn is_ready(&self) -> bool { + *self.inner.waiting.lock().unwrap() == 1 + } +} + +impl Clone for WaitBlocker { + fn clone(&self) -> Self { + let mut w = self.inner.waiting.lock().unwrap(); + *w += 1; + drop(w); + Self { + inner: self.inner.clone(), + } + } +} + +impl Drop for WaitBlocker { + fn drop(&mut self) { + let mut w = self.inner.waiting.lock().unwrap(); + *w -= 1; + if *w == 0 { + self.inner.cvar.notify_all() + } + } +} From eb7806572b0522a0e51bc19793f9656f80c24f13 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 23 Jun 2024 20:53:05 +0200 Subject: [PATCH 143/189] lang: remove this attempt --- Cargo.lock | 339 ------------------ crates/lang/Cargo.toml | 4 - crates/lang/src/ast.rs | 72 ---- crates/lang/src/ast/error.rs | 30 -- crates/lang/src/ast/mod_tree.rs | 281 --------------- crates/lang/src/ast/namespace.rs | 103 ------ crates/lang/src/ast/nodes.rs | 77 ---- crates/lang/src/ast/path.rs | 94 ----- crates/lang/src/ast/source_file.rs | 81 ----- crates/lang/src/lib.rs | 2 - crates/lang/src/main.rs | 5 +- crates/lang/src/world.rs | 55 --- crates/lang/src/world/error.rs | 17 - crates/lang/src/world/files.rs | 131 ------- crates/lang/src/world/modules.rs | 175 --------- crates/lang/src/world/nodes.rs | 77 ---- crates/lang/src/world/registry.rs | 41 --- crates/lang/src/world/world_creation_pool.rs | 215 ----------- .../world/world_creation_pool/wait_blocker.rs | 87 ----- 19 files changed, 1 insertion(+), 1885 deletions(-) delete mode 100644 crates/lang/src/ast.rs delete mode 100644 crates/lang/src/ast/error.rs delete mode 100644 crates/lang/src/ast/mod_tree.rs delete mode 100644 crates/lang/src/ast/namespace.rs delete mode 100644 crates/lang/src/ast/nodes.rs delete mode 100644 crates/lang/src/ast/path.rs delete mode 100644 crates/lang/src/ast/source_file.rs delete mode 100644 crates/lang/src/world.rs delete mode 100644 crates/lang/src/world/error.rs delete mode 100644 crates/lang/src/world/files.rs delete mode 100644 crates/lang/src/world/modules.rs delete mode 100644 crates/lang/src/world/nodes.rs delete mode 100644 crates/lang/src/world/registry.rs delete mode 100644 crates/lang/src/world/world_creation_pool.rs delete mode 100644 crates/lang/src/world/world_creation_pool/wait_blocker.rs diff --git a/Cargo.lock b/Cargo.lock index 92c691e..fff075e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,133 +82,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-process" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-signal" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - [[package]] name = "autocfg" version = "1.1.0" @@ -248,19 +121,6 @@ dependencies = [ "serde", ] -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - [[package]] name = "bytemuck" version = "1.14.0" @@ -331,15 +191,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "countme" version = "3.0.1" @@ -515,12 +366,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bda8e21c04aca2ae33ffc2fd8c23134f3cac46db123ba97bd9d3f3b8a4a85e1" -[[package]] -name = "easy-parallel" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2afbb9b0aef60e4f0d2b18129b6c0dff035a6f7dbbd17c2f38c1432102ee223c" - [[package]] name = "ego-tree" version = "0.6.2" @@ -560,16 +405,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "eval" version = "0.1.0" @@ -580,27 +415,6 @@ dependencies = [ "serde", ] -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener", - "pin-project-lite", -] - [[package]] name = "exr" version = "1.71.0" @@ -617,12 +431,6 @@ dependencies = [ "zune-inflate", ] -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - [[package]] name = "fdeflate" version = "0.3.3" @@ -663,31 +471,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "getrandom" version = "0.2.12" @@ -827,18 +610,14 @@ dependencies = [ "crossbeam", "dashmap", "drop_bomb", - "easy-parallel", "ego-tree", "enumset", - "futures-lite", "indexmap", "indoc", "logos", - "num_cpus", "owo-colors", "petgraph", "rowan", - "smol", ] [[package]] @@ -870,12 +649,6 @@ dependencies = [ "redox_syscall 0.4.1", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - [[package]] name = "lock_api" version = "0.4.11" @@ -974,16 +747,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_threads" version = "0.1.6" @@ -1014,12 +777,6 @@ dependencies = [ "supports-color", ] -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - [[package]] name = "parking_lot_core" version = "0.9.10" @@ -1085,23 +842,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "piper" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "png" version = "0.17.10" @@ -1115,21 +855,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6a007746f34ed64099e88783b0ae369eaa3da6392868ba262e2af9b8fbaea1" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.52.0", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -1274,19 +999,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - [[package]] name = "ryu" version = "1.0.16" @@ -1330,15 +1042,6 @@ dependencies = [ "serde", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -1351,38 +1054,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - [[package]] name = "smallvec" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" -[[package]] -name = "smol" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" -dependencies = [ - "async-channel", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite", -] - [[package]] name = "spin" version = "0.9.8" @@ -1486,22 +1163,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" - [[package]] name = "unicode-ident" version = "1.0.12" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index f50073a..de54f2b 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -16,13 +16,9 @@ rowan = "0.15.15" drop_bomb = "0.1.5" enumset = "1.1.3" indoc = "2" -num_cpus = "1.16" dashmap = "5.5.3" crossbeam = "0.8.4" owo-colors = {version = "4", features = ["supports-colors"]} -smol = "2" -futures-lite = "2.3" -easy-parallel = "3.3.1" [lints] workspace = true diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs deleted file mode 100644 index 0c63620..0000000 --- a/crates/lang/src/ast.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::{collections::HashMap, path::PathBuf}; - -use rowan::ast::{AstNode, AstPtr}; - -use self::{ - error::{Error, WorldCreationError}, - mod_tree::ModuleTree, - namespace::Registry, - source_file::SourceFile, -}; - -mod error; -mod mod_tree; -mod namespace; -mod nodes; -mod path; -mod source_file; - -#[derive(Debug)] -struct Loc { - file: PathBuf, - syntax_el: AstPtr, -} - -impl Loc { - pub fn new(file: PathBuf, syntax_el: &T) -> Self { - Self { - file, - syntax_el: AstPtr::new(syntax_el), - } - } - - pub fn file(&self) -> &PathBuf { - &self.file - } -} - -pub struct World { - entry_point: PathBuf, - files: HashMap, - errors: Vec, - module_tree: ModuleTree, - registry: Registry, -} - -impl World { - pub fn new(entry_point: PathBuf) -> Result { - let entry_point = entry_point.canonicalize().unwrap(); - let source = match std::fs::read_to_string(&entry_point) { - Ok(f) => f, - Err(e) => return Err(WorldCreationError::FailedToOpenEntryPoint(entry_point, e)), - }; - - let (src, mut errors) = SourceFile::parse_from(&entry_point, source); - - let (module_tree, mut files, new_errors, registry) = - ModuleTree::parse_from_main(&entry_point, &src); - errors.extend(new_errors); - module_tree.print_tree(&src.tree()); - dbg!(&errors); - - let _ = files.insert(entry_point.clone(), src); - - Ok(Self { - files, - entry_point, - errors, - module_tree, - registry, - }) - } -} diff --git a/crates/lang/src/ast/error.rs b/crates/lang/src/ast/error.rs deleted file mode 100644 index 352e831..0000000 --- a/crates/lang/src/ast/error.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::{fmt::Display, path::PathBuf}; - -use crate::lst_parser::error::SyntaxError; - -#[derive(Debug)] -pub enum Error { - Syntax(PathBuf, SyntaxError), - FailedToOpenFileMod(PathBuf, std::io::Error), -} - -impl Error { - pub fn from_syntax(file: PathBuf, e: SyntaxError) -> Self { - Self::Syntax(file, e) - } -} - -#[derive(Debug)] -pub enum WorldCreationError { - FailedToOpenEntryPoint(PathBuf, std::io::Error), -} - -impl Display for WorldCreationError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - WorldCreationError::FailedToOpenEntryPoint(entry_path, e) => { - write!(f, "failed to open entry_point '{entry_path:?}': {e}") - } - } - } -} diff --git a/crates/lang/src/ast/mod_tree.rs b/crates/lang/src/ast/mod_tree.rs deleted file mode 100644 index 2e5e269..0000000 --- a/crates/lang/src/ast/mod_tree.rs +++ /dev/null @@ -1,281 +0,0 @@ -use std::{ - cell::RefCell, - collections::HashMap, - path::{Path, PathBuf}, - rc::Rc, - sync::Arc, -}; - -use rowan::ast::{AstNode, SyntaxNodePtr}; - -use crate::{lst_parser::syntax_kind::SyntaxKind, Lang, SyntaxNode}; - -use super::{ - error::Error, - namespace::Registry, - nodes::{self, Mod, ModBody, ModName, Root}, - path::{ItemPath, OwnedItemPath}, - source_file::SourceFile, - Loc, -}; - -pub struct ModuleTree { - modules: Rc>>, -} - -#[derive(Clone)] -struct ModuleParsingContext { - files: Rc>>, - errors: Rc>>, - reg: Rc>, - proj_dir: Rc, - cur_path: Vec, - cur_file: PathBuf, -} - -impl ModuleParsingContext { - fn new(entry_path: &Path) -> Self { - let proj_dir = entry_path.parent().unwrap().to_owned(); - Self { - files: Rc::new(RefCell::new(HashMap::new())), - errors: Rc::new(RefCell::new(Vec::new())), - reg: Rc::new(RefCell::new(Registry::new())), - proj_dir: Rc::new(entry_path.to_owned()), - cur_path: Vec::new(), - cur_file: entry_path.to_owned(), - } - } - - fn entry_path(&self) -> PathBuf { - self.proj_dir.to_path_buf() - } - - fn make_mod_file_path(&self, mod_path: &[String], mod_name: &str) -> PathBuf { - let mut entry_path = self.entry_path(); - for el in mod_path { - entry_path.push(format!("{el}/")); - } - entry_path.push(format!("{mod_name}.owo")); - entry_path - } - - fn push_cur_path(&mut self, name_to_add: String) { - self.cur_path.push(name_to_add); - } - - fn set_cur_file(&mut self, new: PathBuf) { - self.cur_file = new; - } - - fn push_errs(&self, errs: Vec) { - self.errors.borrow_mut().extend(errs); - } - - fn parse_child_modules( - &self, - node: &SyntaxNode, - name: Option, - ) -> HashMap> { - let mut ctx = self.clone(); - if let Some(name) = name { - ctx.push_cur_path(name) - } - node.children() - .filter_map(Mod::cast) - .filter_map(|m| match Module::parse_mod(m, self.clone()) { - Ok(module) => Some((module.name(), module)), - Err(error) => { - self.errors.borrow_mut().push(error); - None - } - }) - .collect::>>() - } - - fn dissolve(self) -> (HashMap, Vec, Registry) { - let Self { - files, - errors, - mut reg, - .. - } = self; - (files.take(), errors.take(), (&*reg).take()) - } -} - -impl ModuleTree { - pub fn parse_from_main( - path: &PathBuf, - main_file: &SourceFile, - ) -> (Self, HashMap, Vec, Registry) { - let entry_path = path.parent().unwrap().to_owned(); - let ctx = ModuleParsingContext::new(&entry_path); - - let modules = Rc::new(ctx.parse_child_modules(main_file.tree().syntax(), None)); - - let (files, errors, reg) = ctx.dissolve(); - (Self { modules }, files, errors, reg) - } - - pub fn print_tree(&self, lst: &Root) { - let name = "main"; - print_tree(&name, self.modules.clone(), 0) - } -} - -#[derive(Debug)] -pub struct Module { - path: Vec, - name: String, - kind: ModuleKind, - children: Rc>>, - parent: Option>, - body: SyntaxNodePtr, -} - -impl Module { - fn parse_mod(module: Mod, mut ctx: ModuleParsingContext) -> Result, Error> { - let children = module - .syntax() - .children() - // .map(|n| n.kind()) - .collect::>(); - - let r; - if children.len() == 1 { - let name = &children[0]; - assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); - r = Self::parse_file_mod( - name.text().to_string(), - ctx.clone(), - Loc::new(ctx.cur_file.clone(), &module), - ); - } else if children.len() == 2 { - let name = &children[0]; - assert_eq!(name.kind(), SyntaxKind::MODULE_NAME); - let body = &children[1]; - assert_eq!(body.kind(), SyntaxKind::MODULE_BODY); - r = Ok(Self::parse_inline_mod(module, ctx.clone())); - } else { - unreachable!() - } - r.map(|module| { - let rc = Rc::new(module); - ctx.reg.borrow_mut().insert_mod(rc.path(), rc.clone()); - rc - }) - } - - fn parse_file_mod( - name: String, - mut ctx: ModuleParsingContext, - decl: Loc, - ) -> Result { - ctx.set_cur_file(ctx.make_mod_file_path(&ctx.cur_path, &name)); - - let source = match std::fs::read_to_string(&ctx.cur_file) { - Ok(f) => f, - Err(e) => return Err(Error::FailedToOpenFileMod(ctx.cur_file, e)), - }; - - let (source_file, file_errors) = SourceFile::parse_from(&ctx.cur_file, source); - - let old_path = ctx.cur_path.clone(); - ctx.push_cur_path(name.clone()); - ctx.push_errs(file_errors); - - let children = - Rc::new(ctx.parse_child_modules(source_file.tree().syntax(), Some(name.clone()))); - let body = SyntaxNodePtr::new(source_file.tree().syntax()); - - ctx.files - .borrow_mut() - .insert(ctx.cur_file.clone(), source_file); - - Ok(Self { - path: old_path, - name, - kind: ModuleKind::File { - declaration: decl, - file_id: ctx.cur_file.clone(), - }, - children, - parent: None, - body, - }) - } - - fn parse_inline_mod(module: Mod, mut ctx: ModuleParsingContext) -> Self { - let mut children = module.syntax().children().collect::>(); - - let body = ModBody::cast(children.pop().unwrap()).unwrap(); - let name = ModName::cast(children.pop().unwrap()) - .unwrap() - .syntax() - .text() - .to_string(); - - let old_path = ctx.cur_path.clone(); - ctx.push_cur_path(name.clone()); - let children = Rc::new(ctx.parse_child_modules(body.syntax(), Some(name.clone()))); - - Self { - name, - kind: ModuleKind::Inline(Loc::new(ctx.cur_file.to_owned(), &module)), - children, - parent: None, - path: old_path, - body: SyntaxNodePtr::new(body.syntax()), - } - } - - pub fn path(&self) -> ItemPath { - let mut p = self.path.clone(); - p.push(self.name()); - let mut r_p = ItemPath::new(); - for i in p { - r_p = r_p.push(i); - } - r_p - } - - pub fn name(&self) -> String { - // self.name.to_node(lst.syntax()).syntax().text().to_string() - self.name.clone() - } - - pub fn body(&self, files: &HashMap) -> SyntaxNode { - match &self.kind { - ModuleKind::Inline(l) => { - let file = files.get(l.file()).unwrap(); - self.body.to_node(file.tree().syntax()) - } - ModuleKind::File { file_id, .. } => files.get(file_id).unwrap().tree().syntax().clone(), - } - } -} - -fn print_tree(name: &str, children: Rc>>, level: u32) { - const INDENT_STR: &str = " "; - - for _ in 0..level { - print!("{}", INDENT_STR); - } - print!("{name}\n"); - - // for (name, module) in children.iter() { - // ; - // } - children - .iter() - .for_each(|(name, m)| print_tree(name, m.children.clone(), level + 1)) -} - -#[derive(Debug)] -enum ModuleKind { - Inline(Loc), - File { - declaration: Loc, - file_id: PathBuf, - }, -} diff --git a/crates/lang/src/ast/namespace.rs b/crates/lang/src/ast/namespace.rs deleted file mode 100644 index 014a6c8..0000000 --- a/crates/lang/src/ast/namespace.rs +++ /dev/null @@ -1,103 +0,0 @@ -use std::{ - cell::RefCell, - collections::{HashMap, HashSet}, - rc::Rc, -}; - -use super::{ - mod_tree::Module, - nodes, - path::{ItemPath, OwnedItemPath}, -}; - -// requires mappings: -// names -> sets of references to individual objects -// paths -> individual objects -// glob paths -> sets of object refs -// (OPT/LATER) names (fuzzy) ~> sets of objects -#[derive(Debug)] -pub struct Registry { - defs: Vec>, - mods: Vec>, - names: HashMap>, - paths: HashMap, -} - -impl Registry { - pub fn new() -> Self { - Self { - defs: Vec::new(), - mods: Vec::new(), - names: HashMap::new(), - paths: HashMap::new(), - } - } - - // TODO: rewrite. has lots of flaws - pub fn insert_mod(&mut self, path: ItemPath<'_>, module: Rc) -> Option { - let idx = self.mods.len(); - let Some(name) = path.name() else { return None }; - self.mods.push(StoreObj::new(&name, Mod { module })); - - if let Some(set) = self.names.get_mut(&name) { - set.insert(RegistryIdx::Mod(idx)); - } else { - self.names - .insert(name, HashSet::from([RegistryIdx::Mod(idx)])); - } - - if self - .paths - .get(&path.clone().into()) - .is_some_and(|other_idx| *other_idx != RegistryIdx::Mod(idx)) - { - return None; - } else { - self.paths.insert(path.into(), RegistryIdx::Mod(idx)) - } - } -} - -impl Default for Registry { - fn default() -> Self { - Self::new() - } -} - -#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)] -pub enum RegistryIdx { - Def(usize), - Mod(usize), -} - -#[derive(Debug)] -struct StoreObj { - inner: Rc>, -} - -impl StoreObj { - pub fn new(name: impl ToString, item: T) -> Self { - Self { - inner: Rc::new(InnerStoreObj { - name: name.to_string(), - obj: item, - }), - } - } -} - -#[derive(Debug)] -struct InnerStoreObj { - name: String, - obj: T, -} - -#[derive(Debug)] -struct Mod { - module: Rc, -} - -#[derive(Debug)] -struct Def { - node: nodes::Def, -} diff --git a/crates/lang/src/ast/nodes.rs b/crates/lang/src/ast/nodes.rs deleted file mode 100644 index 744596e..0000000 --- a/crates/lang/src/ast/nodes.rs +++ /dev/null @@ -1,77 +0,0 @@ -use crate::lst_parser::syntax_kind::SyntaxKind::*; -use crate::SyntaxNode; -use rowan::Language; -macro_rules! ast_nodes { - ($($ast:ident, $kind:ident);+) => { - $( - #[derive(Debug, PartialEq, Eq, Hash)] - #[repr(transparent)] - pub struct $ast(SyntaxNode); - impl rowan::ast::AstNode for $ast { - type Language = crate::Lang; - - fn can_cast(kind: ::Kind) -> bool { - kind == $kind - } - - fn cast(node: SyntaxNode) -> Option { - if node.kind() == $kind { - Some(Self(node)) - } else { - None - } - } - - fn syntax(&self) -> &SyntaxNode { - &self.0 - } - } - )+ - }; -} -ast_nodes!( - Def, DEF; - DefName, DEF_NAME; - DefBody, DEF_BODY; - - Mod, MODULE; - ModName, MODULE_NAME; - ModBody, MODULE_BODY; - - Use, USE; - UsePat, USE_PAT; - PatItem, PAT_ITEM; - PatGlob, PAT_GLOB; - PatGroup, PAT_GROUP; - - Literal, LITERAL; - IntLit, INT_NUM; - FloatLit, FLOAT_NUM; - StringLit, STRING; - - Matrix, MATRIX; - MatrixRow, MAT_ROW; - Vector, VEC; - List, LIST; - CollectionItem, COLLECTION_ITEM; - - ParenthesizedExpr, PARENTHESIZED_EXPR; - Expression, EXPR; - - Pipeline, PIPELINE; - - Instruction, INSTR; - InstructionName, INSTR_NAME; - InstructionParams, INSTR_PARAMS; - - AttributeSet, ATTR_SET; - Attribute, ATTR; - AttributeName, ATTR_NAME; - AttributeValue, ATTR_VALUE; - - ParseError, PARSE_ERR; - LexError, LEX_ERR; - - Root, ROOT; - Eof, EOF -); diff --git a/crates/lang/src/ast/path.rs b/crates/lang/src/ast/path.rs deleted file mode 100644 index a15f141..0000000 --- a/crates/lang/src/ast/path.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::borrow::Cow; - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct ItemPath<'a> { - items: Vec>, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct OwnedItemPath { - items: Vec, -} - -impl OwnedItemPath { - pub fn name(&self) -> Option { - self.items.last().cloned() - } -} - -impl From> for OwnedItemPath { - fn from(value: ItemPath<'_>) -> Self { - Self { - items: value - .items - .into_iter() - .map(|v| v.into_owned()) - .collect::>(), - } - } -} - -impl<'a> ItemPath<'a> { - pub fn new() -> Self { - Self { items: Vec::new() } - } - - pub fn from_slices(slice: &[&'a str]) -> Self { - Self { - items: slice.into_iter().map(|i| (*i).into()).collect::>(), - } - } - - pub fn push(mut self, item: impl Into>) -> Self { - self.items.push(item.into()); - self - } - - pub fn name(&self) -> Option { - self.items.last().cloned().map(|item| item.into_owned()) - } -} - -impl<'a> TryFrom> for ItemPath<'a> { - type Error = (); - - fn try_from(value: Pattern<'a>) -> Result { - let mut items = Vec::new(); - - for i in value.items { - match i { - PatternEl::Name(n) => items.push(n), - PatternEl::Glob => return Err(()), - } - } - - Ok(Self { items }) - } -} - -#[derive(Clone, Debug)] -pub struct Pattern<'a> { - items: Vec>, -} - -impl<'a> Pattern<'a> { - pub fn new() -> Self { - Self { items: Vec::new() } - } - - pub fn add_name(mut self, name: &'a str) -> Self { - self.items.push(PatternEl::Name(name.into())); - self - } - - pub fn add_glob(mut self) -> Self { - self.items.push(PatternEl::Glob); - self - } -} - -#[derive(Clone, Debug)] -enum PatternEl<'a> { - Name(Cow<'a, str>), - Glob, -} diff --git a/crates/lang/src/ast/source_file.rs b/crates/lang/src/ast/source_file.rs deleted file mode 100644 index 912decd..0000000 --- a/crates/lang/src/ast/source_file.rs +++ /dev/null @@ -1,81 +0,0 @@ -use std::path::{Path, PathBuf}; - -use rowan::ast::{AstNode, AstPtr}; - -use crate::lst_parser::{ - grammar::source_file, - input::Input, - output::Output, - syntax_kind::{self, SyntaxKind}, - Parser, -}; - -use super::{ - error::Error, - nodes::{Def, Mod, Root, Use}, -}; - -#[derive(Debug)] -pub struct SourceFile { - lst: Root, - modules: Vec>, - defs: Vec>, - uses: Vec>, -} - -impl SourceFile { - pub fn parse_from(path: &Path, source_text: String) -> (Self, Vec) { - let toks = syntax_kind::lex(&source_text); - let input = Input::new(&toks); - let mut parser = Parser::new(input); - - source_file(&mut parser); - - let parser_out = parser.finish(); - let out = Output::from_parser_output(toks, parser_out); - - let lst = out.syntax(); - - let mut modules = Vec::new(); - let mut defs = Vec::new(); - let mut uses = Vec::new(); - - for c in lst.children() { - match c.kind() { - SyntaxKind::MODULE => modules.push(AstPtr::new(&Mod::cast(c).unwrap())), - SyntaxKind::DEF => defs.push(AstPtr::new(&Def::cast(c).unwrap())), - SyntaxKind::USE => uses.push(AstPtr::new(&Use::cast(c).unwrap())), - _ => {} - } - } - - ( - Self { - lst: Root::cast(lst).unwrap(), - modules, - defs, - uses, - }, - out.errors() - .into_iter() - .map(|err| Error::from_syntax(path.to_owned(), err)) - .collect(), - ) - } - - pub fn tree(&self) -> &Root { - &self.lst - } - - pub fn top_level_modules(&self) -> Vec> { - self.modules.clone() - } - - pub fn top_level_defs(&self) -> Vec> { - self.defs.clone() - } - - pub fn top_level_uses(&self) -> Vec> { - self.uses.clone() - } -} diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index f48385e..a45e202 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -2,9 +2,7 @@ use crate::lst_parser::syntax_kind::SyntaxKind; -pub mod ast; pub mod lst_parser; -pub mod world; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Lang {} diff --git a/crates/lang/src/main.rs b/crates/lang/src/main.rs index c0c04d5..e9c0257 100644 --- a/crates/lang/src/main.rs +++ b/crates/lang/src/main.rs @@ -1,10 +1,7 @@ use clap::Parser; use std::{fs, path::PathBuf}; -use lang::{ - ast::World, - lst_parser::{self, grammar, input, output::Output, syntax_kind}, -}; +use lang::lst_parser::{self, grammar, input, output::Output, syntax_kind}; #[derive(Parser)] struct Args { diff --git a/crates/lang/src/world.rs b/crates/lang/src/world.rs deleted file mode 100644 index 2f32cab..0000000 --- a/crates/lang/src/world.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::{ - fmt::Display, - path::{Path, PathBuf}, - sync::{Arc, Mutex}, -}; - -use crate::world::world_creation_pool::WorldCreationPool; - -use easy_parallel::Parallel; -use futures_lite::future; -use smol::{ - channel::{unbounded, Sender}, - Executor, -}; - -use self::{error::Error, files::Files, registry::Registry}; - -pub mod error; -pub mod files; -pub mod modules; -pub mod nodes; -pub mod registry; -mod world_creation_pool; - -pub struct World {} - -impl World { - pub fn new(entry_point: &Path) -> Result { - let files = Files::new(); - let reg = Registry::new(); - - let (entry_point_id, errors) = files.add_and_parse(entry_point).map_err(|e| { - WorldCreationError::FailedToOpenEntryPoint(entry_point.to_path_buf(), e) - })?; - - let pool = WorldCreationPool::new(files, reg); - - todo!() - } -} - -#[derive(Debug)] -pub enum WorldCreationError { - FailedToOpenEntryPoint(PathBuf, std::io::Error), -} - -impl Display for WorldCreationError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - WorldCreationError::FailedToOpenEntryPoint(entry_path, e) => { - write!(f, "failed to open entry_point '{entry_path:?}': {e}") - } - } - } -} diff --git a/crates/lang/src/world/error.rs b/crates/lang/src/world/error.rs deleted file mode 100644 index 6232a68..0000000 --- a/crates/lang/src/world/error.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::path::PathBuf; - -use crate::lst_parser::error::SyntaxError; - -use super::files::FileId; - -#[derive(Debug)] -pub enum Error { - Syntax(FileId, SyntaxError), - FailedToOpenFileMod(PathBuf, std::io::Error), -} - -impl Error { - pub fn from_syntax(file: FileId, e: SyntaxError) -> Self { - Self::Syntax(file, e) - } -} diff --git a/crates/lang/src/world/files.rs b/crates/lang/src/world/files.rs deleted file mode 100644 index b4a1309..0000000 --- a/crates/lang/src/world/files.rs +++ /dev/null @@ -1,131 +0,0 @@ -use std::{ - clone, fs, - path::{Path, PathBuf}, - sync::{Arc, Mutex, RwLock}, -}; - -use dashmap::DashMap; -use rowan::ast::{AstNode, AstPtr}; - -use crate::{ - lst_parser::{ - error::SyntaxError, grammar::source_file, input::Input, output::Output, syntax_kind, Parser, - }, - Lang, -}; - -use super::{error::Error, modules::Module, nodes}; - -#[derive(Clone)] -pub struct Loc> { - file: FileId, - syntax: AstPtr, -} - -impl> Loc { - pub fn new(node: N, file: FileId) -> Self { - Self { - file, - syntax: AstPtr::new(&node), - } - } - - pub fn file(&self) -> FileId { - self.file - } - - pub fn syntax(&self) -> AstPtr { - self.syntax.clone() - } -} - -/// global file store -/// contains all known files etc. -#[derive(Clone)] -pub struct Files { - paths: Arc>>, - store: Arc>>, -} - -impl Files { - pub fn new() -> Self { - Self { - paths: Arc::new(Mutex::new(Vec::new())), - store: Arc::new(DashMap::new()), - } - } - - pub fn add_and_parse(&self, path: &Path) -> Result<(FileId, Vec), std::io::Error> { - let (file, errors) = SourceFile::read_and_parse(&path)?; - - // add file to paths and unlock again - let id = { - let path = path.clone(); - let mut paths = self.paths.lock().unwrap(); - let r = paths.len(); - paths.push(path.to_path_buf()); - FileId(r) - }; - - let _ = self.store.insert(path.to_path_buf(), Arc::new(file)); - - Ok(( - id, - errors - .into_iter() - .map(|e| Error::from_syntax(id, e)) - .collect(), - )) - } - - pub fn get(&self, id: FileId) -> Arc { - let path = { - let paths = self.paths.lock().unwrap(); - paths[id.0].clone() - }; - - self.store.get(&path).unwrap().clone() - } - - pub fn get_path(&self, id: FileId) -> PathBuf { - let paths = self.paths.lock().unwrap(); - paths[id.0].clone() - } - - pub fn path_store(&self) -> Arc>> { - self.paths.clone() - } -} - -pub struct SourceFile { - pub lst: RwLock, - root_module: Option>, -} - -impl SourceFile { - fn read_and_parse(path: &Path) -> Result<(Self, Vec), std::io::Error> { - let source_text = fs::read_to_string(&path)?; - - let toks = syntax_kind::lex(&source_text); - let input = Input::new(&toks); - let mut parser = Parser::new(input); - - source_file(&mut parser); - - let events = parser.finish(); - let out = Output::from_parser_output(toks, events); - // let lst = out.syntax(); - let (lst, errors) = out.dissolve(); - - Ok(( - Self { - lst: RwLock::new(lst), - root_module: None, - }, - errors, - )) - } -} - -#[derive(Debug, Clone, Copy)] -pub struct FileId(pub usize); diff --git a/crates/lang/src/world/modules.rs b/crates/lang/src/world/modules.rs deleted file mode 100644 index 676553b..0000000 --- a/crates/lang/src/world/modules.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::{ - string::String, - sync::{Arc, Mutex}, -}; - -use dashmap::{DashMap, DashSet}; -use rowan::ast::{AstNode, AstPtr}; - -use crate::SyntaxNode; - -use super::{ - files::{FileId, Loc}, - nodes, - registry::ItemPath, - world_creation_pool::{wait_blocker::WaitBlocker, Task, WorkerCtx}, -}; - -pub struct Module { - /// is none if this is the root module of the entry point file - decl: Option>, - body: ModuleBody, - own_path: ItemPath, - child_modules: Arc>>, - child_defs: Arc>, -} - -impl Module { - pub fn parse_mod_body( - ctx: &WorkerCtx, - tree: SyntaxNode, - path: ItemPath, - file: FileId, - ) -> (DashMap>>>>, Vec) { - let children: Vec<(String, Arc>>>, nodes::Mod)> = tree - .children() - .filter_map(|c| nodes::Mod::cast(c)) - .map(|m| { - let name = nodes::ModName::cast(m.syntax().first_child().unwrap()) - .expect("ModName should always be first child of Mod"); - ( - name.syntax().text().to_string(), - Arc::new(Mutex::new(None)), - m, - ) - }) - .collect(); - let retv: DashMap>>>> = children - .iter() - .map(|(name, mod_r, _)| (name.to_owned(), mod_r.clone())) - .collect(); - let tasks = children - .into_iter() - .map(|(name, mod_r, loc)| { - let mut path = path.clone(); - path.push(name); - Task::ParseMod(Loc::new(loc, file), mod_r, path) - }) - .collect::>(); - - (retv, tasks) - } - pub fn parse_file0( - ctx: &mut WorkerCtx, - file: FileId, - path: ItemPath, - decl: Option>, - ) { - let tree = ctx.get_tree(file); - - let (retv, tasks) = Self::parse_mod_body(ctx, tree, path.clone(), file); - - ctx.send_tasks( - Task::ParseFileMod1 { - file, - decl, - ret: retv.into(), - path, - }, - tasks, - ) - } - - pub fn parse_mod( - ctx: &mut WorkerCtx, - loc: Loc, - path: ItemPath, - ret: Arc>>, - blocker: WaitBlocker, - ) { - let mod_decl = ctx.resolve_loc(loc); - let children = mod_decl.syntax().children().collect::>(); - - if children.len() == 1 { - // TODO: file mod - todo!() - } else if children.len() == 2 { - // inline mod - } - } - - pub fn parse_inline_mod( - ctx: &mut WorkerCtx, - decl: Loc, - path: ItemPath, - ret: Arc>>>, - blocker: WaitBlocker, - ) { - let mod_decl_children = ctx - .resolve_loc(decl.clone()) - .syntax() - .children() - .collect::>(); - - assert_eq!(mod_decl_children.len(), 2); - - let name = nodes::ModName::cast(mod_decl_children[0].clone()).unwrap(); - let body = nodes::ModBody::cast(mod_decl_children[1].clone()).unwrap(); - - let (retv, tasks) = - Self::parse_mod_body(ctx, body.syntax().clone(), path.clone(), decl.file()); - - ctx.send_tasks( - Task::CompleteMod { - ret_self: ret, - body: ModuleBody::Inline(Loc::new(body, decl.file())), - decl: Some(decl), - path, - child_mods: retv.into(), - blocker, - }, - tasks, - ) - } - - pub fn complete_mod( - ctx: &mut WorkerCtx, - decl: Option>, - ret_self: Arc>>>, - body: ModuleBody, - path: ItemPath, - child_mods: Arc>>>>>, - blocker: WaitBlocker, - ) { - assert!(child_mods - .iter() - .all(|item| item.value().lock().unwrap().is_some())); - - let module = Arc::new(Module { - decl, - body, - own_path: path, - child_modules: Arc::new( - Arc::<_>::unwrap_or_clone(child_mods) - .into_iter() - .map(|(name, module)| { - let module = module.lock().unwrap().take().unwrap(); - (name, module) - }) - .collect(), - ), - child_defs: Arc::default(), - }); - - let mut ret_self = ret_self.lock().unwrap(); - *ret_self = Some(module); - drop(blocker); - } -} - -struct Def; - -pub enum ModuleBody { - Inline(Loc), - File(FileId), -} diff --git a/crates/lang/src/world/nodes.rs b/crates/lang/src/world/nodes.rs deleted file mode 100644 index 303a3a1..0000000 --- a/crates/lang/src/world/nodes.rs +++ /dev/null @@ -1,77 +0,0 @@ -use crate::lst_parser::syntax_kind::SyntaxKind::*; -use crate::SyntaxNode; -use rowan::Language; -macro_rules! ast_nodes { -($($ast:ident, $kind:ident);+) => { - $( - #[derive(Debug, Clone, PartialEq, Eq, Hash)] - #[repr(transparent)] - pub struct $ast(SyntaxNode); - impl rowan::ast::AstNode for $ast { - type Language = crate::Lang; - - fn can_cast(kind: ::Kind) -> bool { - kind == $kind - } - - fn cast(node: SyntaxNode) -> Option { - if node.kind() == $kind { - Some(Self(node)) - } else { - None - } - } - - fn syntax(&self) -> &SyntaxNode { - &self.0 - } - } - )+ -}; -} -ast_nodes!( - Def, DEF; - DefName, DEF_NAME; - DefBody, DEF_BODY; - - Mod, MODULE; - ModName, MODULE_NAME; - ModBody, MODULE_BODY; - - Use, USE; - UsePat, USE_PAT; - PatItem, PAT_ITEM; - PatGlob, PAT_GLOB; - PatGroup, PAT_GROUP; - - Literal, LITERAL; - IntLit, INT_NUM; - FloatLit, FLOAT_NUM; - StringLit, STRING; - - Matrix, MATRIX; - MatrixRow, MAT_ROW; - Vector, VEC; - List, LIST; - CollectionItem, COLLECTION_ITEM; - - ParenthesizedExpr, PARENTHESIZED_EXPR; - Expression, EXPR; - - Pipeline, PIPELINE; - - Instruction, INSTR; - InstructionName, INSTR_NAME; - InstructionParams, INSTR_PARAMS; - - AttributeSet, ATTR_SET; - Attribute, ATTR; - AttributeName, ATTR_NAME; - AttributeValue, ATTR_VALUE; - - ParseError, PARSE_ERR; - LexError, LEX_ERR; - - Root, ROOT; - Eof, EOF -); diff --git a/crates/lang/src/world/registry.rs b/crates/lang/src/world/registry.rs deleted file mode 100644 index 791be15..0000000 --- a/crates/lang/src/world/registry.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::sync::{Arc, Mutex, RwLock}; - -use dashmap::{DashMap, DashSet}; - -use super::modules::Module; - -pub type ItemPath = Vec; - -#[derive(Clone)] -pub struct Registry(Arc); - -impl Registry { - pub fn new() -> Self { - Self(Arc::new(RegistryInner::new())) - } -} - -struct RegistryInner { - /// ids will refer to paths of modules - paths: RwLock>, - modules: DashMap>, - names: DashMap>, -} - -impl RegistryInner { - fn new() -> Self { - Self { - paths: RwLock::new(Vec::new()), - modules: DashMap::new(), - names: DashMap::new(), - } - } -} - -pub enum RegistryId { - /// refer to the modlue item itself, the name must be the same as the last item of the path - Module(usize), - /// refer to a def in a module - /// name must refer to name of child of module - Def(usize), -} diff --git a/crates/lang/src/world/world_creation_pool.rs b/crates/lang/src/world/world_creation_pool.rs deleted file mode 100644 index 651d7eb..0000000 --- a/crates/lang/src/world/world_creation_pool.rs +++ /dev/null @@ -1,215 +0,0 @@ -use std::{ - collections::HashMap, - path::PathBuf, - sync::{Arc, Mutex}, - thread, -}; - -use crossbeam::channel::{Receiver, Sender}; -use dashmap::DashMap; -use rowan::ast::{AstNode, AstPtr}; - -use crate::{Lang, SyntaxNode}; - -use self::wait_blocker::WaitBlocker; - -use super::{ - error::Error, - files::{FileId, Files, Loc}, - modules::{Module, ModuleBody}, - nodes, - registry::{ItemPath, Registry}, -}; - -pub mod wait_blocker; - -pub(super) struct WorldCreationPool { - workers: Vec, - tx: Sender, -} - -impl WorldCreationPool { - pub fn new(files: Files, reg: Registry) -> Self { - let mut workers = Vec::new(); - let (tx, rx) = crossbeam::channel::unbounded(); - - for i in 0..num_cpus::get() { - workers.push(Worker::new( - i, - files.clone(), - reg.clone(), - tx.clone(), - rx.clone(), - )) - } - - Self { workers, tx } - } -} - -enum Job { - WaitingFor(WaitBlocker, Task), - Awaited(WaitBlocker, Task), -} - -pub enum Task { - ParseMod(Loc, Arc>>>, ItemPath), - ParseFileMod0 { - file: FileId, - decl: Option>, - path: ItemPath, - }, - ParseFileMod1 { - file: FileId, - decl: Option>, - path: ItemPath, - ret: Arc>>>>>, - }, - CompleteMod { - ret_self: Arc>>>, - decl: Option>, - body: ModuleBody, - path: ItemPath, - child_mods: Arc>>>>>, - blocker: WaitBlocker, - }, - OpenFile(PathBuf), -} - -struct Worker { - id: usize, - // thead: thread::JoinHandle>, - thread: thread::JoinHandle<()>, -} - -pub struct WorkerCtx { - errors: Vec, - files: Files, - local_files: HashMap, - pub reg: Registry, - tx: Sender, -} - -impl WorkerCtx { - pub fn get_tree(&mut self, id: FileId) -> SyntaxNode { - let p = self.files.get_path(id); - if self.local_files.contains_key(&p) { - self.local_files[&p].clone() - } else { - let f = self.files.get(id); - let lst = SyntaxNode::new_root(f.lst.read().unwrap().clone()); - self.local_files.insert(p, lst.clone()); - lst - } - } - - pub fn resolve_loc>(&mut self, loc: Loc) -> N { - let f = self.get_tree(loc.file()); - - loc.syntax().to_node(&f) - } - - pub fn send_tasks(&self, task: Task, dependencies: Vec) { - let blocker = WaitBlocker::new(); - for dep_task in dependencies { - self.tx - .send(Job::Awaited(blocker.clone(), dep_task)) - .unwrap(); - } - self.tx.send(Job::WaitingFor(blocker, task)).unwrap(); - } -} - -impl Worker { - fn new(id: usize, files: Files, reg: Registry, sender: Sender, rx: Receiver) -> Self { - let thread_handle = thread::spawn(move || { - let ctx = WorkerCtx { - errors: Vec::new(), - local_files: HashMap::new(), - files, - reg, - tx: sender, - }; - - for job in &rx { - // if matches!(job, Job::WithCond(_, _)) { - - // } - match job { - Job::WaitingFor(blocker, task) => { - if blocker.is_ready() { - Self::do_task(&ctx, task, None) - } else if rx.is_empty() { - if let Some(blocker) = - blocker.wait_for(std::time::Duration::from_millis(50)) - { - ctx.tx.send(Job::WaitingFor(blocker, task)).unwrap(); - } else { - Self::do_task(&ctx, task, None) - } - } else { - ctx.tx.send(Job::WaitingFor(blocker, task)).unwrap(); - } - } - Job::Awaited(blocker, task) => { - Self::do_task(&ctx, task, Some(blocker.clone())); - drop(blocker) - } - } - - // if let Job::WithCond(blocker, job_inner) = job_msg { - // if blocker.is_ready() { - // job = Box::::into_inner(job_inner); - // } else if rx.is_empty() { - // if let Some(blocker) = - // blocker.wait_for(std::time::Duration::from_millis(50)) - // { - // job = Job::WithCond(blocker, job_inner); - // } else { - // job = Box::::into_inner(job_inner); - // } - // } else { - // job = Job::WithCond(blocker, job_inner); - // } - // } else { - // job = job_msg; - // } - - // match job { - // Job::ParseFileMod { file, decl } => todo!(), - // Job::OpenFile(path) => todo!(), - // Job::WithCond(blocker, job) => { - // ctx.tx.send(Job::WithCond(blocker, job)).unwrap() - // } - // } - } - }); - - Self { - id, - thread: thread_handle, - } - } - - fn do_task(ctx: &WorkerCtx, task: Task, blocker: Option) { - match task { - Task::ParseMod(_, _, _) => todo!(), - Task::ParseFileMod0 { file, decl, path } => todo!(), - Task::ParseFileMod1 { - file, - decl, - path, - ret, - } => todo!(), - Task::CompleteMod { - ret_self, - decl, - body, - path, - child_mods, - blocker, - } => todo!(), - Task::OpenFile(_) => todo!(), - } - } -} diff --git a/crates/lang/src/world/world_creation_pool/wait_blocker.rs b/crates/lang/src/world/world_creation_pool/wait_blocker.rs deleted file mode 100644 index 2d23d8a..0000000 --- a/crates/lang/src/world/world_creation_pool/wait_blocker.rs +++ /dev/null @@ -1,87 +0,0 @@ -use std::{ - sync::{Arc, Condvar, Mutex}, - time::Duration, -}; - -/// like a WaitGroup from crossbeam, but can also just check if it's the last one -pub struct WaitBlocker { - inner: Arc, -} - -struct Inner { - waiting: Mutex, - cvar: Condvar, -} - -impl WaitBlocker { - pub fn new() -> Self { - Self { - inner: Arc::new(Inner { - waiting: Mutex::new(1), - cvar: Condvar::new(), - }), - } - } - - pub fn wait(self) { - if *self.inner.waiting.lock().unwrap() == 1 { - return; - } - - let inner = self.inner.clone(); - drop(self); - - inner - .cvar - .wait_while(inner.waiting.lock().unwrap(), |w| *w > 0); - } - - pub fn wait_for(self, dur: Duration) -> Option { - if *self.inner.waiting.lock().unwrap() == 1 { - return None; - } - - let inner = self.inner.clone(); - drop(self); - - let (_, timeout_res) = inner - .cvar - .wait_timeout_while(inner.waiting.lock().unwrap(), dur, |w| *w > 0) - .unwrap(); - - if timeout_res.timed_out() { - None - } else { - { - let mut w = inner.waiting.lock().unwrap(); - *w += 1; - } - Some(Self { inner }) - } - } - - pub fn is_ready(&self) -> bool { - *self.inner.waiting.lock().unwrap() == 1 - } -} - -impl Clone for WaitBlocker { - fn clone(&self) -> Self { - let mut w = self.inner.waiting.lock().unwrap(); - *w += 1; - drop(w); - Self { - inner: self.inner.clone(), - } - } -} - -impl Drop for WaitBlocker { - fn drop(&mut self) { - let mut w = self.inner.waiting.lock().unwrap(); - *w -= 1; - if *w == 0 { - self.inner.cvar.notify_all() - } - } -} From 3eee768ce1cd92a4f02c9105faef718b47bc9ba9 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sat, 6 Jul 2024 21:57:42 +0200 Subject: [PATCH 144/189] lang: work on various things - work on new world - add file db - source_file parsing - locs - fix some test stuff --- Cargo.lock | 30 ++++++ crates/lang/Cargo.toml | 1 + crates/lang/src/ast.rs | 78 ++++++++++++++ crates/lang/src/lib.rs | 2 + crates/lang/src/lst_parser/grammar.rs | 2 +- crates/lang/src/lst_parser/output.rs | 11 +- crates/lang/src/world.rs | 14 +++ crates/lang/src/world/error.rs | 10 ++ crates/lang/src/world/files.rs | 56 ++++++++++ crates/lang/src/world/files/loc.rs | 29 ++++++ crates/lang/src/world/files/source_file.rs | 113 +++++++++++++++++++++ crates/svg-filters/src/main.rs | 63 +++++++++++- 12 files changed, 395 insertions(+), 14 deletions(-) create mode 100644 crates/lang/src/ast.rs create mode 100644 crates/lang/src/world.rs create mode 100644 crates/lang/src/world/error.rs create mode 100644 crates/lang/src/world/files.rs create mode 100644 crates/lang/src/world/files/loc.rs create mode 100644 crates/lang/src/world/files/source_file.rs diff --git a/Cargo.lock b/Cargo.lock index fff075e..4ff50ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -618,6 +618,7 @@ dependencies = [ "owo-colors", "petgraph", "rowan", + "strip-ansi-escapes", ] [[package]] @@ -1069,6 +1070,15 @@ dependencies = [ "lock_api", ] +[[package]] +name = "strip-ansi-escapes" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ff8ef943b384c414f54aefa961dd2bd853add74ec75e7ac74cf91dba62bcfa" +dependencies = [ + "vte", +] + [[package]] name = "strsim" version = "0.10.0" @@ -1181,6 +1191,26 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "vte" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" +dependencies = [ + "utf8parse", + "vte_generate_state_changes", +] + +[[package]] +name = "vte_generate_state_changes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/crates/lang/Cargo.toml b/crates/lang/Cargo.toml index de54f2b..c7a2659 100644 --- a/crates/lang/Cargo.toml +++ b/crates/lang/Cargo.toml @@ -19,6 +19,7 @@ indoc = "2" dashmap = "5.5.3" crossbeam = "0.8.4" owo-colors = {version = "4", features = ["supports-colors"]} +strip-ansi-escapes = "0.2.0" [lints] workspace = true diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs new file mode 100644 index 0000000..42d160c --- /dev/null +++ b/crates/lang/src/ast.rs @@ -0,0 +1,78 @@ +use crate::lst_parser::syntax_kind::SyntaxKind::*; +use crate::SyntaxNode; +use rowan::Language; +macro_rules! ast_nodes { + ($($ast:ident, $kind:ident);+) => { + $( + #[derive(Debug, Clone, PartialEq, Eq, Hash)] + #[repr(transparent)] + pub struct $ast(SyntaxNode); + impl rowan::ast::AstNode for $ast { + type Language = crate::Lang; + + fn can_cast(kind: ::Kind) -> bool { + kind == $kind + } + + fn cast(node: SyntaxNode) -> Option { + if node.kind() == $kind { + Some(Self(node)) + } else { + None + } + } + + fn syntax(&self) -> &SyntaxNode { + &self.0 + } + } + )+ + }; +} + +ast_nodes!( + Def, DEF; + DefName, DEF_NAME; + DefBody, DEF_BODY; + + Mod, MODULE; + ModName, MODULE_NAME; + ModBody, MODULE_BODY; + + Use, USE; + UsePat, USE_PAT; + PatItem, PAT_ITEM; + PatGlob, PAT_GLOB; + PatGroup, PAT_GROUP; + + Literal, LITERAL; + IntLit, INT_NUM; + FloatLit, FLOAT_NUM; + StringLit, STRING; + + Matrix, MATRIX; + MatrixRow, MAT_ROW; + Vector, VEC; + List, LIST; + CollectionItem, COLLECTION_ITEM; + + ParenthesizedExpr, PARENTHESIZED_EXPR; + Expression, EXPR; + + Pipeline, PIPELINE; + + Instruction, INSTR; + InstructionName, INSTR_NAME; + InstructionParams, INSTR_PARAMS; + + AttributeSet, ATTR_SET; + Attribute, ATTR; + AttributeName, ATTR_NAME; + AttributeValue, ATTR_VALUE; + + ParseError, PARSE_ERR; + LexError, LEX_ERR; + + Root, ROOT; + Eof, EOF +); diff --git a/crates/lang/src/lib.rs b/crates/lang/src/lib.rs index a45e202..f48385e 100644 --- a/crates/lang/src/lib.rs +++ b/crates/lang/src/lib.rs @@ -2,7 +2,9 @@ use crate::lst_parser::syntax_kind::SyntaxKind; +pub mod ast; pub mod lst_parser; +pub mod world; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Lang {} diff --git a/crates/lang/src/lst_parser/grammar.rs b/crates/lang/src/lst_parser/grammar.rs index 2db0824..001050e 100644 --- a/crates/lang/src/lst_parser/grammar.rs +++ b/crates/lang/src/lst_parser/grammar.rs @@ -33,6 +33,6 @@ fn check_parser(input: &str, parser_fn: fn(&mut Parser), output: &str) { let p_out = dbg!(parser.finish()); let o = Output::from_parser_output(toks, p_out); - let s = format!("{o:?}"); + let s = strip_ansi_escapes::strip_str(format!("{o:?}")); assert_eq!(&s, output); } diff --git a/crates/lang/src/lst_parser/output.rs b/crates/lang/src/lst_parser/output.rs index ce96fb5..78433b1 100644 --- a/crates/lang/src/lst_parser/output.rs +++ b/crates/lang/src/lst_parser/output.rs @@ -28,6 +28,7 @@ impl std::fmt::Debug for Output { } const INDENT_STR: &str = " "; +/// colored argument currently broken fn debug_print_green_node( node: NodeOrToken<&GreenNodeData, &GreenTokenData>, f: &mut dyn std::fmt::Write, @@ -39,12 +40,6 @@ fn debug_print_green_node( f.write_str(INDENT_STR)?; } - if !colored { - owo_colors::set_override(false); - } else { - owo_colors::set_override(true); - } - let r = match node { NodeOrToken::Node(n) => { let kind = Lang::kind_from_raw(node.kind()); @@ -103,10 +98,6 @@ fn debug_print_green_node( } }; - if !colored { - owo_colors::unset_override(); - } - r } diff --git a/crates/lang/src/world.rs b/crates/lang/src/world.rs new file mode 100644 index 0000000..2ce9997 --- /dev/null +++ b/crates/lang/src/world.rs @@ -0,0 +1,14 @@ +use std::path::Path; + +mod error; +mod files; + +struct World; + +impl World { + pub fn new(entry_point: &Path) -> Result { + todo!() + } +} + +enum WorldCreationError {} diff --git a/crates/lang/src/world/error.rs b/crates/lang/src/world/error.rs new file mode 100644 index 0000000..1cebf8d --- /dev/null +++ b/crates/lang/src/world/error.rs @@ -0,0 +1,10 @@ +use std::path::PathBuf; + +use crate::{ast::ParseError, lst_parser::error::SyntaxError}; + +use super::files::{FileId, Loc, OpenFileError}; + +pub enum Error { + Syntax(Loc, SyntaxError), + OpenFileError(OpenFileError), +} diff --git a/crates/lang/src/world/files.rs b/crates/lang/src/world/files.rs new file mode 100644 index 0000000..0c112ad --- /dev/null +++ b/crates/lang/src/world/files.rs @@ -0,0 +1,56 @@ +use std::{ + collections::HashMap, + io, + path::{Path, PathBuf}, +}; + +mod loc; + +pub use loc::Loc; +use rowan::ast::AstNode; + +use crate::{ + ast::ParseError, + lst_parser::{self, error::SyntaxError, input, output::Output}, + world::{error::Error, files::source_file::SourceFile}, +}; + +struct Files { + inner: Vec, + path_to_id_map: HashMap, +} + +impl Files { + pub fn add_file(&mut self, path: &Path) -> Result<(FileId, Vec), OpenFileError> { + if !path.exists() { + return Err(OpenFileError::NotFound(path.to_owned())); + } + + let file_id = FileId(self.inner.len()); + let (source_file, errs) = match SourceFile::open(path) { + Ok((source_file, errs)) => { + let errs = errs + .into_iter() + .map(|(ptr, err)| Error::Syntax(Loc::from_ptr(ptr, file_id), err)) + .collect::>(); + (source_file, errs) + } + Err(e) => return Err(OpenFileError::IoError(path.to_path_buf(), e)), + }; + + self.inner.push(source_file); + self.path_to_id_map.insert(path.to_path_buf(), file_id); + + Ok((file_id, errs)) + } +} + +pub enum OpenFileError { + NotFound(PathBuf), + IoError(PathBuf, std::io::Error), +} + +#[derive(Copy, Clone, Debug)] +pub struct FileId(usize); + +mod source_file; diff --git a/crates/lang/src/world/files/loc.rs b/crates/lang/src/world/files/loc.rs new file mode 100644 index 0000000..fa865d8 --- /dev/null +++ b/crates/lang/src/world/files/loc.rs @@ -0,0 +1,29 @@ +use rowan::ast::{AstNode, AstPtr}; + +use crate::Lang; + +use super::FileId; + +#[derive(Clone)] +pub struct Loc> { + file: FileId, + syntax: AstPtr, +} + +impl> Loc { + pub fn new(node: N, file: FileId) -> Self { + Self::from_ptr(AstPtr::new(&node), file) + } + + pub fn from_ptr(ptr: AstPtr, file: FileId) -> Self { + Self { file, syntax: ptr } + } + + pub fn file(&self) -> FileId { + self.file + } + + pub fn syntax(&self) -> AstPtr { + self.syntax.clone() + } +} diff --git a/crates/lang/src/world/files/source_file.rs b/crates/lang/src/world/files/source_file.rs new file mode 100644 index 0000000..8ed8043 --- /dev/null +++ b/crates/lang/src/world/files/source_file.rs @@ -0,0 +1,113 @@ +use crate::lst_parser::{self, grammar, input, syntax_kind}; +use crate::SyntaxNode; + +use crate::lst_parser::output::Output; + +use crate::lst_parser::error::SyntaxError; + +use crate::ast::ParseError; + +use rowan::ast::{AstNode, AstPtr}; + +use std::path::Path; +use std::{fs, io}; + +use rowan::GreenNode; + +use std::path::PathBuf; + +pub(crate) struct SourceFile { + pub(crate) path: PathBuf, + pub(crate) lst: rowan::GreenNode, +} + +impl SourceFile { + pub(crate) fn open(p: &Path) -> io::Result<(Self, Vec<(AstPtr, SyntaxError)>)> { + assert!(p.exists()); + + let f = fs::read_to_string(p)?; + let (lst, errs) = Self::parse(f); + + Ok(( + Self { + path: p.to_path_buf(), + lst, + }, + errs, + )) + } + + pub(crate) fn parse(f: String) -> (GreenNode, Vec<(AstPtr, SyntaxError)>) { + let toks = syntax_kind::lex(&f); + let input = input::Input::new(&toks); + let mut parser = lst_parser::Parser::new(input); + + grammar::source_file(&mut parser); + + let p_out = parser.finish(); + let (lst, errs) = Output::from_parser_output(toks, p_out).dissolve(); + + (lst.clone(), Self::find_errs(lst, errs)) + } + + pub(crate) fn find_errs( + lst: GreenNode, + mut errs: Vec, + ) -> Vec<(AstPtr, SyntaxError)> { + let mut out = Vec::new(); + errs.reverse(); + + let lst = SyntaxNode::new_root(lst); + Self::find_errs_recursive(&mut out, lst, &mut errs); + + out + } + + pub(crate) fn find_errs_recursive( + mut out: &mut Vec<(AstPtr, SyntaxError)>, + lst: SyntaxNode, + mut errs: &mut Vec, + ) { + lst.children() + .filter_map(|c| ParseError::cast(c)) + .for_each(|e| out.push((AstPtr::new(&e), errs.pop().unwrap()))); + + lst.children() + .for_each(|c| Self::find_errs_recursive(out, c, errs)); + } +} + +#[cfg(test)] +mod tests { + use crate::world::files::source_file::SourceFile; + + fn check_find_errs(input: &str, expected: &[&str]) { + let (_, errs) = SourceFile::parse(input.to_string()); + + let errs = errs + .into_iter() + .map(|(loc, err)| format!("{:?}@{:?}", err, loc.syntax_node_ptr().text_range())) + .collect::>(); + + assert_eq!( + errs, + expected + .into_iter() + .map(|s| s.to_string()) + .collect::>() + ) + } + + #[test] + fn test_find_errs() { + check_find_errs( + "def meow = ;\n mod ;", + &["Expected([DEF_BODY])@11..11", "Expected([IDENT])@18..18"], + ); + + check_find_errs( + "def awawa = a |", + &["UnterminatedTopLevelItem@0..15", "PipelineNeedsSink@12..15"], + ) + } +} diff --git a/crates/svg-filters/src/main.rs b/crates/svg-filters/src/main.rs index 5ce0102..a063791 100644 --- a/crates/svg-filters/src/main.rs +++ b/crates/svg-filters/src/main.rs @@ -1,8 +1,65 @@ -use svg_filters::codegen::SvgDocument; +use svg_filters::{ + codegen::SvgDocument, + types::nodes::{ + primitives::{ + blend::BlendMode, + color_matrix::ColorMatrixType, + component_transfer::TransferFn, + displacement_map::Channel, + turbulence::{NoiseType, StitchTiles}, + }, + standard_input::StandardInput, + }, +}; fn main() { let mut doc = SvgDocument::new(); - eprintln!("{}", doc.generate_svg_pretty()); - println!("{}", doc.generate_svg()); + let f = doc.create_filter("cmyk-chromabb"); + + let noise = f.turbulence(0., 0.1, 2, 0, StitchTiles::Stitch, NoiseType::FractalNoise); + let noise = f.component_transfer_rgba( + noise, + TransferFn::Discrete { + table_values: vec![0., 0.2, 0.4, 0.6, 0.8, 1.], + }, + TransferFn::Discrete { + table_values: vec![0., 0.2, 0.4, 0.6, 0.8, 1.], + }, + TransferFn::Discrete { + table_values: vec![0., 0.2, 0.4, 0.6, 0.8, 1.], + }, + TransferFn::Linear { + slope: 0., + intercept: 0.5, + }, + ); + + let cyan = f.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 0., 0., 0., 0., 0., // + 0., 1., 0., 0., 0., // + 0., 0., 1., 0., 0., // + 0., 0., 0., 1., 0., + ])), + ); + let cyan = f.offset(cyan, 25., 0.); + let cyan = f.displacement_map(cyan, noise, 50., Channel::R, Channel::A); + + let magenta = f.color_matrix( + StandardInput::SourceGraphic, + ColorMatrixType::Matrix(Box::new([ + 1., 0., 0., 0., 0., // + 0., 0., 0., 0., 0., // + 0., 0., 1., 0., 0., // + 0., 0., 0., 1., 0., + ])), + ); + let magenta = f.displacement_map(magenta, noise, 50., Channel::R, Channel::A); + let magenta = f.offset(magenta, -25., 0.); + + f.blend(cyan, magenta, BlendMode::Screen); + + println!("{}", doc.generate_svg_pretty()); } From 1e0741e6004309d8cd49c2f5d4bbf8c0eae2b8c2 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Jul 2024 20:20:45 +0200 Subject: [PATCH 145/189] lang: add credit to macro --- crates/lang/src/ast.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/lang/src/ast.rs b/crates/lang/src/ast.rs index 42d160c..d5838a2 100644 --- a/crates/lang/src/ast.rs +++ b/crates/lang/src/ast.rs @@ -1,6 +1,8 @@ use crate::lst_parser::syntax_kind::SyntaxKind::*; use crate::SyntaxNode; use rowan::Language; + +// Heavily modified version of https://github.com/rust-analyzer/rowan/blob/e2d2e93e16c5104b136d0bc738a0d48346922200/examples/s_expressions.rs#L250-L266 macro_rules! ast_nodes { ($($ast:ident, $kind:ident);+) => { $( From dc44244e7b88fa86ca471d2659c4e772d6c9a817 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Jul 2024 20:23:29 +0200 Subject: [PATCH 146/189] lang: work on some basics --- crates/lang/src/world.rs | 15 ++++++++++++++- crates/lang/src/world/files.rs | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/lang/src/world.rs b/crates/lang/src/world.rs index 2ce9997..7713422 100644 --- a/crates/lang/src/world.rs +++ b/crates/lang/src/world.rs @@ -1,5 +1,7 @@ use std::path::Path; +use self::files::{Files, OpenFileError}; + mod error; mod files; @@ -7,8 +9,19 @@ struct World; impl World { pub fn new(entry_point: &Path) -> Result { + let mut files = Files::default(); + let (entry_point_id, errors) = files.add_file(entry_point)?; + todo!() } } -enum WorldCreationError {} +enum WorldCreationError { + FailedToOpenEntryPoint(OpenFileError), +} + +impl From for WorldCreationError { + fn from(value: OpenFileError) -> Self { + Self::FailedToOpenEntryPoint(value) + } +} diff --git a/crates/lang/src/world/files.rs b/crates/lang/src/world/files.rs index 0c112ad..24053d7 100644 --- a/crates/lang/src/world/files.rs +++ b/crates/lang/src/world/files.rs @@ -15,7 +15,8 @@ use crate::{ world::{error::Error, files::source_file::SourceFile}, }; -struct Files { +#[derive(Default)] +pub struct Files { inner: Vec, path_to_id_map: HashMap, } From a2695a2a11f24d5da54c0e214c13c1dae9e15e0c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Jul 2024 20:46:39 +0200 Subject: [PATCH 147/189] processing library: init --- Cargo.lock | 132 +++++++++++++++++++++++++++------ Cargo.toml | 1 + crates/prowocessing/Cargo.toml | 13 ++++ crates/prowocessing/src/lib.rs | 4 + 4 files changed, 126 insertions(+), 24 deletions(-) create mode 100644 crates/prowocessing/Cargo.toml create mode 100644 crates/prowocessing/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4ff50ae..e97cb16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,6 +72,15 @@ dependencies = [ "time", ] +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "ariadne" version = "0.4.0" @@ -431,6 +440,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fast-srgb8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + [[package]] name = "fdeflate" version = "0.3.3" @@ -527,9 +542,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", @@ -537,7 +552,6 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational", "num-traits", "png", "qoi", @@ -718,27 +732,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.17" @@ -843,6 +836,71 @@ dependencies = [ "siphasher", ] +[[package]] +name = "palette" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d38e6e5ca1612e2081cc31188f08c3cba630ce4ba44709a153f1a0f38d678f2" +dependencies = [ + "approx", + "fast-srgb8", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05d1c929301fee6830dafa764341118829b2535c216b0571e3821ecac5c885b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "png" version = "0.17.10" @@ -871,6 +929,14 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prowocessing" +version = "0.1.0" +dependencies = [ + "image", + "palette", +] + [[package]] name = "qoi" version = "0.4.1" @@ -902,6 +968,24 @@ dependencies = [ [[package]] name = "rand" version = "0.8.5" +<<<<<<< HEAD +======= +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rayon" +version = "1.8.0" +>>>>>>> 1d85252 (processing library: init) source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ diff --git a/Cargo.toml b/Cargo.toml index 2d4a618..83becd3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "crates/ir", "crates/lang", "crates/svg-filters", + "crates/prowocessing", ] resolver = "2" diff --git a/crates/prowocessing/Cargo.toml b/crates/prowocessing/Cargo.toml new file mode 100644 index 0000000..42d1a80 --- /dev/null +++ b/crates/prowocessing/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "prowocessing" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +image = "0.24.8" +palette = "0.7.4" + +[lints] +workspace = true diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs new file mode 100644 index 0000000..f83705a --- /dev/null +++ b/crates/prowocessing/src/lib.rs @@ -0,0 +1,4 @@ +//! # This is the image processing library for iOwO +//! +//! One of the design goals for this library is, however, to be a simple, generic image processing library. +//! For now, it's just indev... lets see what comes of it! From 1e9648966fed1167dbcd963aa72d3953280b9fd6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 19 Feb 2024 12:56:47 +0100 Subject: [PATCH 148/189] experimentation: write experiment for enum architecture --- crates/prowocessing/src/lib.rs | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs index f83705a..8affe30 100644 --- a/crates/prowocessing/src/lib.rs +++ b/crates/prowocessing/src/lib.rs @@ -2,3 +2,79 @@ //! //! One of the design goals for this library is, however, to be a simple, generic image processing library. //! For now, it's just indev... lets see what comes of it! + +use experimental::enum_based::{Instruction, PipelineBuilder}; + +/// just some experiments, to test whether the architecture i want is even possible (or how to do it). probably temporary. +/// Gonna first try string processing... +mod experimental { + pub mod enum_based { + pub enum Instruction { + Uppercase, + Lowercase, + } + + pub struct Pipeline { + pipeline: Vec String>, + } + + impl Pipeline { + pub fn run(&self, val: String) -> String { + let mut current = val; + + for instr in &self.pipeline { + current = instr(current); + } + + current + } + } + + pub struct PipelineBuilder { + pipeline: Vec, + } + + impl PipelineBuilder { + pub fn new() -> Self { + Self { + pipeline: Vec::new(), + } + } + + pub fn insert(mut self, instr: Instruction) -> Self { + self.pipeline.push(instr); + self + } + + pub fn build(&self) -> Pipeline { + fn uppercase(v: String) -> String { + str::to_uppercase(&v) + } + fn lowercase(v: String) -> String { + str::to_lowercase(&v) + } + + let mut res = Vec::new(); + + for item in &self.pipeline { + res.push(match item { + Instruction::Uppercase => uppercase, + Instruction::Lowercase => lowercase, + }); + } + + Pipeline { pipeline: res } + } + } + } +} + +#[test] +fn test_enums() { + let builder = PipelineBuilder::new().insert(Instruction::Uppercase); + let upr = builder.build(); + let upr_lowr = builder.insert(Instruction::Lowercase).build(); + + assert_eq!(upr.run(String::from("Test")), String::from("TEST")); + assert_eq!(upr_lowr.run(String::from("Test")), String::from("test")); +} From 56ec11e143edc55beb27de4d7e4a04a0b88da7ed Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 19 Feb 2024 17:54:40 +0100 Subject: [PATCH 149/189] cli: add subcommand support --- crates/app/src/config.rs | 20 +++++------------ crates/app/src/config/cli.rs | 9 +++----- crates/app/src/main.rs | 42 +++++++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index b4d1ed1..552a951 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -1,18 +1,11 @@ -use std::path::PathBuf; - -use clap::Parser; - -use self::{ - cli::Args, - config_file::{find_config_file, Configs}, -}; +use self::config_file::{find_config_file, Configs}; +pub(crate) use cli::CliConfigs; mod cli; mod config_file; /// this struct may hold all configuration pub struct Config { - pub source: PathBuf, pub evaluator: eval::Available, pub startup_msg: bool, @@ -20,10 +13,9 @@ pub struct Config { impl Config { /// Get the configs from all possible places (args, file, env...) - pub fn read() -> Self { - let args = Args::parse(); - let config = if let Some(config) = args.config_path { - Ok(config) + pub fn read(args: &CliConfigs) -> Self { + let config = if let Some(config) = &args.config_path { + Ok(config.clone()) } else { find_config_file() }; @@ -42,7 +34,6 @@ impl Config { if let Some(file) = config { Self { - source: args.source, evaluator: args.evaluator.and(file.evaluator).unwrap_or_default(), // this is negated because to an outward api, the negative is more intuitive, // while in the source the other way around is more intuitive @@ -50,7 +41,6 @@ impl Config { } } else { Self { - source: args.source, startup_msg: !args.no_startup_message, evaluator: args.evaluator.unwrap_or_default(), } diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index 1d9c57a..c0e6c4d 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -1,12 +1,9 @@ use std::path::PathBuf; -use clap::{builder::BoolishValueParser, ArgAction, Parser}; - -#[derive(Parser)] -pub(crate) struct Args { - /// What file contains the pipeline to evaluate. - pub source: PathBuf, +use clap::{builder::BoolishValueParser, ArgAction, Args}; +#[derive(Args)] +pub(crate) struct CliConfigs { /// How to actually run the pipeline. /// Overrides the config file. Defaults to the debug evaluator. #[arg(short, long)] diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 58103a5..7d7eff2 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,6 +1,7 @@ -use std::fs; +use std::{fs, path::PathBuf}; -use config::Config; +use clap::{Parser, Subcommand}; +use config::{CliConfigs, Config}; use welcome_msg::print_startup_msg; mod config; @@ -9,19 +10,44 @@ mod config; mod error_reporting; mod welcome_msg; +#[derive(Parser)] +struct Args { + #[command(flatten)] + configs: CliConfigs, + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Run { + /// What file contains the pipeline to evaluate. + source: PathBuf, + }, + Dev, +} + fn main() { // TODO: proper error handling across the whole function // don't forget to also look inside `Config` - let cfg = Config::read(); + let args = Args::parse(); + let cfg = Config::read(&args.configs); if cfg.startup_msg { print_startup_msg(); } - let source = fs::read_to_string(cfg.source).expect("can't find source file"); - let ir = ir::from_ron(&source).expect("failed to parse source to graph ir"); + match args.command { + Commands::Run { source } => { + let source = fs::read_to_string(source).expect("can't find source file"); + let ir = ir::from_ron(&source).expect("failed to parse source to graph ir"); - let mut machine = cfg.evaluator.pick(); - machine.feed(ir); - machine.eval_full(); + let mut machine = cfg.evaluator.pick(); + machine.feed(ir); + machine.eval_full(); + } + Commands::Dev => { + println!("Hello world!"); + } + } } From db9228dec49b740fb2b353304c8a65e9ac0843ab Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 19 Feb 2024 18:07:09 +0100 Subject: [PATCH 150/189] cli: add dev command for enums experiment --- Cargo.lock | 1 + crates/app/Cargo.toml | 1 + crates/app/src/main.rs | 36 +++++++++++++++++++++++++++++++--- crates/prowocessing/src/lib.rs | 9 ++++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e97cb16..123e4ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,6 +66,7 @@ dependencies = [ "eval", "ir", "owo-colors", + "prowocessing", "ron", "serde", "serde_json", diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 10182c2..d316efc 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -12,6 +12,7 @@ clap = { workspace = true, features = [ "derive", "env" ] } dirs = "5" eval = { path = "../eval" } ir = { path = "../ir" } +prowocessing = { path = "../prowocessing"} owo-colors = "4" ron = "0.8" serde = { workspace = true, features = [ "derive" ] } diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 7d7eff2..2caaa2f 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -2,6 +2,7 @@ use std::{fs, path::PathBuf}; use clap::{Parser, Subcommand}; use config::{CliConfigs, Config}; +use dev::DevCommands; use welcome_msg::print_startup_msg; mod config; @@ -24,7 +25,10 @@ enum Commands { /// What file contains the pipeline to evaluate. source: PathBuf, }, - Dev, + Dev { + #[command(subcommand)] + dev_command: DevCommands, + }, } fn main() { @@ -46,8 +50,34 @@ fn main() { machine.feed(ir); machine.eval_full(); } - Commands::Dev => { - println!("Hello world!"); + Commands::Dev { dev_command } => dev_command.run(), + } +} + +mod dev { + use clap::Subcommand; + use prowocessing::experimental::enum_based::{Pipeline, PipelineBuilder}; + + #[derive(Subcommand)] + pub(crate) enum DevCommands { + Enums { test_str: String }, + } + + impl DevCommands { + pub fn run(self) { + match self { + DevCommands::Enums { test_str } => { + let upr = PipelineBuilder::new() + .insert(prowocessing::experimental::enum_based::Instruction::Uppercase) + .build(); + let lwr = PipelineBuilder::new() + .insert(prowocessing::experimental::enum_based::Instruction::Lowercase) + .build(); + + println!("Upr: {}", upr.run(test_str.clone())); + println!("Lwr: {}", lwr.run(test_str.clone())); + } + } } } } diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs index 8affe30..778d544 100644 --- a/crates/prowocessing/src/lib.rs +++ b/crates/prowocessing/src/lib.rs @@ -7,7 +7,7 @@ use experimental::enum_based::{Instruction, PipelineBuilder}; /// just some experiments, to test whether the architecture i want is even possible (or how to do it). probably temporary. /// Gonna first try string processing... -mod experimental { +pub mod experimental { pub mod enum_based { pub enum Instruction { Uppercase, @@ -41,6 +41,7 @@ mod experimental { } } + #[must_use] pub fn insert(mut self, instr: Instruction) -> Self { self.pipeline.push(instr); self @@ -66,6 +67,12 @@ mod experimental { Pipeline { pipeline: res } } } + + impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } + } } } From d9a07c88980b98151cf33cae345029b1f5d369c2 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 19 Feb 2024 18:09:10 +0100 Subject: [PATCH 151/189] prowocessing: extract experiment into its own file --- crates/prowocessing/src/experimental.rs | 1 + .../src/experimental/enum_based.rs | 64 +++++++++++++++++ crates/prowocessing/src/lib.rs | 69 +------------------ 3 files changed, 66 insertions(+), 68 deletions(-) create mode 100644 crates/prowocessing/src/experimental.rs create mode 100644 crates/prowocessing/src/experimental/enum_based.rs diff --git a/crates/prowocessing/src/experimental.rs b/crates/prowocessing/src/experimental.rs new file mode 100644 index 0000000..090198e --- /dev/null +++ b/crates/prowocessing/src/experimental.rs @@ -0,0 +1 @@ +pub mod enum_based; diff --git a/crates/prowocessing/src/experimental/enum_based.rs b/crates/prowocessing/src/experimental/enum_based.rs new file mode 100644 index 0000000..c60f4a9 --- /dev/null +++ b/crates/prowocessing/src/experimental/enum_based.rs @@ -0,0 +1,64 @@ +pub enum Instruction { + Uppercase, + Lowercase, +} + +pub struct Pipeline { + pipeline: Vec String>, +} + +impl Pipeline { + pub fn run(&self, val: String) -> String { + let mut current = val; + + for instr in &self.pipeline { + current = instr(current); + } + + current + } +} + +pub struct PipelineBuilder { + pipeline: Vec, +} + +impl PipelineBuilder { + pub fn new() -> Self { + Self { + pipeline: Vec::new(), + } + } + + #[must_use] + pub fn insert(mut self, instr: Instruction) -> Self { + self.pipeline.push(instr); + self + } + + pub fn build(&self) -> Pipeline { + fn uppercase(v: String) -> String { + str::to_uppercase(&v) + } + fn lowercase(v: String) -> String { + str::to_lowercase(&v) + } + + let mut res = Vec::new(); + + for item in &self.pipeline { + res.push(match item { + Instruction::Uppercase => uppercase, + Instruction::Lowercase => lowercase, + }); + } + + Pipeline { pipeline: res } + } +} + +impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } +} diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs index 778d544..2e7b047 100644 --- a/crates/prowocessing/src/lib.rs +++ b/crates/prowocessing/src/lib.rs @@ -7,74 +7,7 @@ use experimental::enum_based::{Instruction, PipelineBuilder}; /// just some experiments, to test whether the architecture i want is even possible (or how to do it). probably temporary. /// Gonna first try string processing... -pub mod experimental { - pub mod enum_based { - pub enum Instruction { - Uppercase, - Lowercase, - } - - pub struct Pipeline { - pipeline: Vec String>, - } - - impl Pipeline { - pub fn run(&self, val: String) -> String { - let mut current = val; - - for instr in &self.pipeline { - current = instr(current); - } - - current - } - } - - pub struct PipelineBuilder { - pipeline: Vec, - } - - impl PipelineBuilder { - pub fn new() -> Self { - Self { - pipeline: Vec::new(), - } - } - - #[must_use] - pub fn insert(mut self, instr: Instruction) -> Self { - self.pipeline.push(instr); - self - } - - pub fn build(&self) -> Pipeline { - fn uppercase(v: String) -> String { - str::to_uppercase(&v) - } - fn lowercase(v: String) -> String { - str::to_lowercase(&v) - } - - let mut res = Vec::new(); - - for item in &self.pipeline { - res.push(match item { - Instruction::Uppercase => uppercase, - Instruction::Lowercase => lowercase, - }); - } - - Pipeline { pipeline: res } - } - } - - impl Default for PipelineBuilder { - fn default() -> Self { - Self::new() - } - } - } -} +pub mod experimental; #[test] fn test_enums() { From 26996fbd009933b7419a7ddd43a9d6d57f6c314c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 19 Feb 2024 20:54:24 +0100 Subject: [PATCH 152/189] prowocessing: add trait based experiment --- crates/app/src/main.rs | 14 +- crates/prowocessing/src/experimental.rs | 2 + .../src/experimental/trait_based.rs | 339 ++++++++++++++++++ crates/prowocessing/src/lib.rs | 4 +- 4 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 crates/prowocessing/src/experimental/trait_based.rs diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 2caaa2f..2534631 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -56,17 +56,20 @@ fn main() { mod dev { use clap::Subcommand; - use prowocessing::experimental::enum_based::{Pipeline, PipelineBuilder}; + use prowocessing::experimental::trait_based::DataType; #[derive(Subcommand)] pub(crate) enum DevCommands { Enums { test_str: String }, + Add { num0: i32, num1: i32 }, } impl DevCommands { pub fn run(self) { match self { DevCommands::Enums { test_str } => { + use prowocessing::experimental::enum_based::PipelineBuilder; + let upr = PipelineBuilder::new() .insert(prowocessing::experimental::enum_based::Instruction::Uppercase) .build(); @@ -77,6 +80,15 @@ mod dev { println!("Upr: {}", upr.run(test_str.clone())); println!("Lwr: {}", lwr.run(test_str.clone())); } + DevCommands::Add { num0, num1 } => { + use prowocessing::experimental::trait_based::PipelineBuilder; + + let pipe = PipelineBuilder::new().add(1).stringify().build(); + println!( + "{:?}", + pipe.run(vec![num0.into(), num1.into()].into()).into_inner()[0] + ); + } } } } diff --git a/crates/prowocessing/src/experimental.rs b/crates/prowocessing/src/experimental.rs index 090198e..fcc0d52 100644 --- a/crates/prowocessing/src/experimental.rs +++ b/crates/prowocessing/src/experimental.rs @@ -1 +1,3 @@ pub mod enum_based; + +pub mod trait_based; diff --git a/crates/prowocessing/src/experimental/trait_based.rs b/crates/prowocessing/src/experimental/trait_based.rs new file mode 100644 index 0000000..3be8f3a --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based.rs @@ -0,0 +1,339 @@ +use self::{ + numops::{Add, Stringify, Subtract}, + strops::{Concatenate, Lower, Upper}, +}; + +trait PipelineElement { + fn runner(&self) -> fn(&Inputs) -> Outputs; + fn signature(&self) -> ElementIo; +} + +struct ElementIo { + pub inputs: Vec, + pub outputs: Vec, +} + +// TODO: +// - Bind additional inputs if instruction has more then one and is passd without any additional +// - allow binding to pointers to other pipelines? +// - allow referencing earlier data +pub struct PipelineBuilder { + elements: Vec>, +} + +pub struct Pipeline { + runners: Vec Outputs>, +} + +impl Pipeline { + pub fn run(&self, inputs: Inputs) -> Outputs { + let mut out: Outputs = inputs.into(); + + for runner in &self.runners { + out = runner(&(&out).into()); + } + + out + } +} + +impl PipelineBuilder { + pub fn new() -> Self { + Self { + elements: Vec::new(), + } + } + + fn insert(mut self, el: T) -> Self { + if let Some(previous_item) = self.elements.last() { + assert_eq!( + previous_item.signature().outputs[0], + el.signature().inputs[0] + ); + } + self.elements.push(Box::new(el)); + self + } + + #[must_use] + pub fn concatenate(self, sec: String) -> Self { + self.insert(Concatenate(sec)) + } + + #[must_use] + pub fn upper(self) -> Self { + self.insert(Upper) + } + + #[must_use] + pub fn lower(self) -> Self { + self.insert(Lower) + } + + #[must_use] + #[allow( + clippy::should_implement_trait, + reason = "is not equivalent to addition" + )] + pub fn add(self, sec: i32) -> Self { + self.insert(Add(sec)) + } + + #[must_use] + pub fn subtract(self, sec: i32) -> Self { + self.insert(Subtract(sec)) + } + + #[must_use] + pub fn stringify(self) -> Self { + self.insert(Stringify) + } + + pub fn build(&self) -> Pipeline { + let mut r = Vec::new(); + + self.elements.iter().for_each(|el| r.push(el.runner())); + + Pipeline { runners: r } + } +} + +impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } +} + +#[derive(Clone, Copy)] +pub enum Data<'a> { + String(&'a str), + Int(i32), +} +impl Data<'_> { + pub fn to_owned_data(&self) -> OwnedData { + match self { + Data::String(s) => (*s).to_owned().into(), + Data::Int(i) => (*i).into(), + } + } +} +impl<'a> From<&'a str> for Data<'a> { + fn from(value: &'a str) -> Self { + Self::String(value) + } +} +impl From for Data<'_> { + fn from(value: i32) -> Self { + Self::Int(value) + } +} +impl<'a> From<&'a OwnedData> for Data<'a> { + fn from(value: &'a OwnedData) -> Self { + match value { + OwnedData::String(s) => Data::String(s), + OwnedData::Int(i) => Data::Int(*i), + } + } +} + +#[derive(Clone, Debug)] +pub enum OwnedData { + String(String), + Int(i32), +} +impl From for OwnedData { + fn from(value: String) -> Self { + Self::String(value) + } +} +impl From for OwnedData { + fn from(value: i32) -> Self { + Self::Int(value) + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum DataType { + String, + Int, +} + +pub struct Inputs<'a>(Vec>); +impl<'a> Inputs<'a> { + fn inner(&self) -> Vec> { + self.0.clone() + } +} +impl<'a> From>> for Inputs<'a> { + fn from(value: Vec>) -> Self { + Self(value) + } +} +impl<'a, T: Into>> From for Inputs<'a> { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} +impl<'a> From<&'a Outputs> for Inputs<'a> { + fn from(value: &'a Outputs) -> Self { + Self(value.0.iter().map(std::convert::Into::into).collect()) + } +} + +pub struct Outputs(Vec); +impl Outputs { + pub fn into_inner(self) -> Vec { + self.0 + } +} +impl From> for Outputs { + fn from(value: Vec) -> Self { + Self(value) + } +} +impl> From for Outputs { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} +impl From> for Outputs { + fn from(value: Inputs) -> Self { + Self( + value + .0 + .into_iter() + .map(|i: Data<'_>| Data::to_owned_data(&i)) + .collect(), + ) + } +} + +mod strops { + use super::{Data, DataType, ElementIo, Inputs, Outputs, PipelineElement}; + + pub struct Concatenate(pub String); + impl PipelineElement for Concatenate { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { + format!("{s0}{s1}").into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String, DataType::String], + outputs: vec![DataType::String], + } + } + } + + pub struct Upper; + impl PipelineElement for Upper { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s), ..] = input.inner()[..] { + s.to_uppercase().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String], + outputs: vec![DataType::String], + } + } + } + + pub struct Lower; + impl PipelineElement for Lower { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s), ..] = input.inner()[..] { + s.to_lowercase().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String], + outputs: vec![DataType::String], + } + } + } +} + +mod numops { + use core::panic; + + use super::{Data, DataType, ElementIo, Inputs, Outputs, PipelineElement}; + + pub struct Add(pub i32); + impl PipelineElement for Add { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + (i0 + i1).into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int, DataType::Int], + outputs: vec![DataType::Int], + } + } + } + + pub struct Subtract(pub i32); + impl PipelineElement for Subtract { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + (i0 + i1).into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int, DataType::Int], + outputs: vec![DataType::Int], + } + } + } + + pub struct Stringify; + impl PipelineElement for Stringify { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(int), ..] = input.inner()[..] { + int.to_string().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int], + outputs: vec![DataType::String], + } + } + } +} diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs index 2e7b047..aa81057 100644 --- a/crates/prowocessing/src/lib.rs +++ b/crates/prowocessing/src/lib.rs @@ -2,8 +2,7 @@ //! //! One of the design goals for this library is, however, to be a simple, generic image processing library. //! For now, it's just indev... lets see what comes of it! - -use experimental::enum_based::{Instruction, PipelineBuilder}; +#![feature(lint_reasons)] /// just some experiments, to test whether the architecture i want is even possible (or how to do it). probably temporary. /// Gonna first try string processing... @@ -11,6 +10,7 @@ pub mod experimental; #[test] fn test_enums() { + use crate::experimental::enum_based::{Instruction, PipelineBuilder}; let builder = PipelineBuilder::new().insert(Instruction::Uppercase); let upr = builder.build(); let upr_lowr = builder.insert(Instruction::Lowercase).build(); From dddbcccf7262072cb8616580f1d21de2c37f2b94 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 21 Feb 2024 13:11:31 +0100 Subject: [PATCH 153/189] prowocessing: refactor trait based experiment to individual files --- crates/app/src/main.rs | 3 +- .../src/experimental/trait_based.rs | 343 +----------------- .../src/experimental/trait_based/data.rs | 2 + .../src/experimental/trait_based/data/io.rs | 51 +++ .../src/experimental/trait_based/data/raw.rs | 48 +++ .../src/experimental/trait_based/element.rs | 19 + .../src/experimental/trait_based/ops.rs | 7 + .../src/experimental/trait_based/ops/num.rs | 69 ++++ .../src/experimental/trait_based/ops/str.rs | 67 ++++ .../src/experimental/trait_based/pipeline.rs | 94 +++++ 10 files changed, 362 insertions(+), 341 deletions(-) create mode 100644 crates/prowocessing/src/experimental/trait_based/data.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/data/io.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/data/raw.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/element.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/ops.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/ops/num.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/ops/str.rs create mode 100644 crates/prowocessing/src/experimental/trait_based/pipeline.rs diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 2534631..d5a260c 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -56,7 +56,6 @@ fn main() { mod dev { use clap::Subcommand; - use prowocessing::experimental::trait_based::DataType; #[derive(Subcommand)] pub(crate) enum DevCommands { @@ -81,7 +80,7 @@ mod dev { println!("Lwr: {}", lwr.run(test_str.clone())); } DevCommands::Add { num0, num1 } => { - use prowocessing::experimental::trait_based::PipelineBuilder; + use prowocessing::experimental::trait_based::pipeline::PipelineBuilder; let pipe = PipelineBuilder::new().add(1).stringify().build(); println!( diff --git a/crates/prowocessing/src/experimental/trait_based.rs b/crates/prowocessing/src/experimental/trait_based.rs index 3be8f3a..de2fdac 100644 --- a/crates/prowocessing/src/experimental/trait_based.rs +++ b/crates/prowocessing/src/experimental/trait_based.rs @@ -1,339 +1,4 @@ -use self::{ - numops::{Add, Stringify, Subtract}, - strops::{Concatenate, Lower, Upper}, -}; - -trait PipelineElement { - fn runner(&self) -> fn(&Inputs) -> Outputs; - fn signature(&self) -> ElementIo; -} - -struct ElementIo { - pub inputs: Vec, - pub outputs: Vec, -} - -// TODO: -// - Bind additional inputs if instruction has more then one and is passd without any additional -// - allow binding to pointers to other pipelines? -// - allow referencing earlier data -pub struct PipelineBuilder { - elements: Vec>, -} - -pub struct Pipeline { - runners: Vec Outputs>, -} - -impl Pipeline { - pub fn run(&self, inputs: Inputs) -> Outputs { - let mut out: Outputs = inputs.into(); - - for runner in &self.runners { - out = runner(&(&out).into()); - } - - out - } -} - -impl PipelineBuilder { - pub fn new() -> Self { - Self { - elements: Vec::new(), - } - } - - fn insert(mut self, el: T) -> Self { - if let Some(previous_item) = self.elements.last() { - assert_eq!( - previous_item.signature().outputs[0], - el.signature().inputs[0] - ); - } - self.elements.push(Box::new(el)); - self - } - - #[must_use] - pub fn concatenate(self, sec: String) -> Self { - self.insert(Concatenate(sec)) - } - - #[must_use] - pub fn upper(self) -> Self { - self.insert(Upper) - } - - #[must_use] - pub fn lower(self) -> Self { - self.insert(Lower) - } - - #[must_use] - #[allow( - clippy::should_implement_trait, - reason = "is not equivalent to addition" - )] - pub fn add(self, sec: i32) -> Self { - self.insert(Add(sec)) - } - - #[must_use] - pub fn subtract(self, sec: i32) -> Self { - self.insert(Subtract(sec)) - } - - #[must_use] - pub fn stringify(self) -> Self { - self.insert(Stringify) - } - - pub fn build(&self) -> Pipeline { - let mut r = Vec::new(); - - self.elements.iter().for_each(|el| r.push(el.runner())); - - Pipeline { runners: r } - } -} - -impl Default for PipelineBuilder { - fn default() -> Self { - Self::new() - } -} - -#[derive(Clone, Copy)] -pub enum Data<'a> { - String(&'a str), - Int(i32), -} -impl Data<'_> { - pub fn to_owned_data(&self) -> OwnedData { - match self { - Data::String(s) => (*s).to_owned().into(), - Data::Int(i) => (*i).into(), - } - } -} -impl<'a> From<&'a str> for Data<'a> { - fn from(value: &'a str) -> Self { - Self::String(value) - } -} -impl From for Data<'_> { - fn from(value: i32) -> Self { - Self::Int(value) - } -} -impl<'a> From<&'a OwnedData> for Data<'a> { - fn from(value: &'a OwnedData) -> Self { - match value { - OwnedData::String(s) => Data::String(s), - OwnedData::Int(i) => Data::Int(*i), - } - } -} - -#[derive(Clone, Debug)] -pub enum OwnedData { - String(String), - Int(i32), -} -impl From for OwnedData { - fn from(value: String) -> Self { - Self::String(value) - } -} -impl From for OwnedData { - fn from(value: i32) -> Self { - Self::Int(value) - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub enum DataType { - String, - Int, -} - -pub struct Inputs<'a>(Vec>); -impl<'a> Inputs<'a> { - fn inner(&self) -> Vec> { - self.0.clone() - } -} -impl<'a> From>> for Inputs<'a> { - fn from(value: Vec>) -> Self { - Self(value) - } -} -impl<'a, T: Into>> From for Inputs<'a> { - fn from(value: T) -> Self { - Self(vec![value.into()]) - } -} -impl<'a> From<&'a Outputs> for Inputs<'a> { - fn from(value: &'a Outputs) -> Self { - Self(value.0.iter().map(std::convert::Into::into).collect()) - } -} - -pub struct Outputs(Vec); -impl Outputs { - pub fn into_inner(self) -> Vec { - self.0 - } -} -impl From> for Outputs { - fn from(value: Vec) -> Self { - Self(value) - } -} -impl> From for Outputs { - fn from(value: T) -> Self { - Self(vec![value.into()]) - } -} -impl From> for Outputs { - fn from(value: Inputs) -> Self { - Self( - value - .0 - .into_iter() - .map(|i: Data<'_>| Data::to_owned_data(&i)) - .collect(), - ) - } -} - -mod strops { - use super::{Data, DataType, ElementIo, Inputs, Outputs, PipelineElement}; - - pub struct Concatenate(pub String); - impl PipelineElement for Concatenate { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { - format!("{s0}{s1}").into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::String, DataType::String], - outputs: vec![DataType::String], - } - } - } - - pub struct Upper; - impl PipelineElement for Upper { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::String(s), ..] = input.inner()[..] { - s.to_uppercase().into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::String], - outputs: vec![DataType::String], - } - } - } - - pub struct Lower; - impl PipelineElement for Lower { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::String(s), ..] = input.inner()[..] { - s.to_lowercase().into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::String], - outputs: vec![DataType::String], - } - } - } -} - -mod numops { - use core::panic; - - use super::{Data, DataType, ElementIo, Inputs, Outputs, PipelineElement}; - - pub struct Add(pub i32); - impl PipelineElement for Add { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::Int, DataType::Int], - outputs: vec![DataType::Int], - } - } - } - - pub struct Subtract(pub i32); - impl PipelineElement for Subtract { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::Int, DataType::Int], - outputs: vec![DataType::Int], - } - } - } - - pub struct Stringify; - impl PipelineElement for Stringify { - fn runner(&self) -> fn(&Inputs) -> Outputs { - |input| { - if let [Data::Int(int), ..] = input.inner()[..] { - int.to_string().into() - } else { - panic!("Invalid data passed") - } - } - } - - fn signature(&self) -> ElementIo { - ElementIo { - inputs: vec![DataType::Int], - outputs: vec![DataType::String], - } - } - } -} +pub mod data; +pub mod element; +pub mod ops; +pub mod pipeline; diff --git a/crates/prowocessing/src/experimental/trait_based/data.rs b/crates/prowocessing/src/experimental/trait_based/data.rs new file mode 100644 index 0000000..cc27567 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data.rs @@ -0,0 +1,2 @@ +pub mod io; +pub mod raw; diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs new file mode 100644 index 0000000..fe40344 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -0,0 +1,51 @@ +use super::raw::{Data, OwnedData}; + +pub struct Inputs<'a>(Vec>); +impl<'a> Inputs<'a> { + pub(crate) fn inner(&self) -> Vec> { + self.0.clone() + } +} +impl<'a> From>> for Inputs<'a> { + fn from(value: Vec>) -> Self { + Self(value) + } +} +impl<'a, T: Into>> From for Inputs<'a> { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} +impl<'a> From<&'a Outputs> for Inputs<'a> { + fn from(value: &'a Outputs) -> Self { + Self(value.0.iter().map(std::convert::Into::into).collect()) + } +} + +pub struct Outputs(Vec); +impl Outputs { + pub fn into_inner(self) -> Vec { + self.0 + } +} +impl From> for Outputs { + fn from(value: Vec) -> Self { + Self(value) + } +} +impl> From for Outputs { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} +impl From> for Outputs { + fn from(value: Inputs) -> Self { + Self( + value + .0 + .into_iter() + .map(|i: Data<'_>| Data::to_owned_data(&i)) + .collect(), + ) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs new file mode 100644 index 0000000..88c16e7 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -0,0 +1,48 @@ +#[derive(Clone, Copy)] +pub enum Data<'a> { + String(&'a str), + Int(i32), +} + +impl Data<'_> { + pub fn to_owned_data(&self) -> OwnedData { + match self { + Data::String(s) => (*s).to_owned().into(), + Data::Int(i) => (*i).into(), + } + } +} +impl<'a> From<&'a str> for Data<'a> { + fn from(value: &'a str) -> Self { + Self::String(value) + } +} +impl From for Data<'_> { + fn from(value: i32) -> Self { + Self::Int(value) + } +} +impl<'a> From<&'a OwnedData> for Data<'a> { + fn from(value: &'a OwnedData) -> Self { + match value { + OwnedData::String(s) => Data::String(s), + OwnedData::Int(i) => Data::Int(*i), + } + } +} + +#[derive(Clone, Debug)] +pub enum OwnedData { + String(String), + Int(i32), +} +impl From for OwnedData { + fn from(value: String) -> Self { + Self::String(value) + } +} +impl From for OwnedData { + fn from(value: i32) -> Self { + Self::Int(value) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/element.rs b/crates/prowocessing/src/experimental/trait_based/element.rs new file mode 100644 index 0000000..6fdba6b --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/element.rs @@ -0,0 +1,19 @@ +use crate::experimental::trait_based::data::io::Inputs; + +use super::data::io::Outputs; + +pub(crate) trait PipelineElement { + fn runner(&self) -> fn(&Inputs) -> Outputs; + fn signature(&self) -> ElementIo; +} + +pub(crate) struct ElementIo { + pub inputs: Vec, + pub outputs: Vec, +} + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum DataType { + String, + Int, +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops.rs b/crates/prowocessing/src/experimental/trait_based/ops.rs new file mode 100644 index 0000000..e7c9d04 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops.rs @@ -0,0 +1,7 @@ +mod num; +mod str; + +pub mod prelude { + pub(crate) use super::num::*; + pub(crate) use super::str::*; +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs new file mode 100644 index 0000000..88b57d3 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -0,0 +1,69 @@ +use core::panic; + +use crate::experimental::trait_based::{ + data::{ + io::{Inputs, Outputs}, + raw::Data, + }, + element::{DataType, ElementIo, PipelineElement}, +}; + +pub struct Add(pub i32); +impl PipelineElement for Add { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + (i0 + i1).into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int, DataType::Int], + outputs: vec![DataType::Int], + } + } +} + +pub struct Subtract(pub i32); +impl PipelineElement for Subtract { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + (i0 + i1).into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int, DataType::Int], + outputs: vec![DataType::Int], + } + } +} + +pub struct Stringify; +impl PipelineElement for Stringify { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::Int(int), ..] = input.inner()[..] { + int.to_string().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::Int], + outputs: vec![DataType::String], + } + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs new file mode 100644 index 0000000..56c39ad --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -0,0 +1,67 @@ +use crate::experimental::trait_based::{ + data::{ + io::{Inputs, Outputs}, + raw::Data, + }, + element::{DataType, ElementIo, PipelineElement}, +}; + +pub struct Concatenate(pub String); +impl PipelineElement for Concatenate { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { + format!("{s0}{s1}").into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String, DataType::String], + outputs: vec![DataType::String], + } + } +} + +pub struct Upper; +impl PipelineElement for Upper { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s), ..] = input.inner()[..] { + s.to_uppercase().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String], + outputs: vec![DataType::String], + } + } +} + +pub struct Lower; +impl PipelineElement for Lower { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + if let [Data::String(s), ..] = input.inner()[..] { + s.to_lowercase().into() + } else { + panic!("Invalid data passed") + } + } + } + + fn signature(&self) -> ElementIo { + ElementIo { + inputs: vec![DataType::String], + outputs: vec![DataType::String], + } + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/pipeline.rs b/crates/prowocessing/src/experimental/trait_based/pipeline.rs new file mode 100644 index 0000000..628130b --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/pipeline.rs @@ -0,0 +1,94 @@ +use super::data::io::{Inputs, Outputs}; +use super::element::PipelineElement; +use super::ops::prelude::*; + +// TODO: +// - Bind additional inputs if instruction has more then one and is passd without any additional +// - allow binding to pointers to other pipelines? +// - allow referencing earlier data +pub struct PipelineBuilder { + elements: Vec>, +} + +impl PipelineBuilder { + pub fn new() -> Self { + Self { + elements: Vec::new(), + } + } + + fn insert(mut self, el: T) -> Self { + if let Some(previous_item) = self.elements.last() { + assert_eq!( + previous_item.signature().outputs[0], + el.signature().inputs[0] + ); + } + self.elements.push(Box::new(el)); + self + } + + #[must_use] + pub fn concatenate(self, sec: String) -> Self { + self.insert(Concatenate(sec)) + } + + #[must_use] + pub fn upper(self) -> Self { + self.insert(Upper) + } + + #[must_use] + pub fn lower(self) -> Self { + self.insert(Lower) + } + + #[must_use] + #[allow( + clippy::should_implement_trait, + reason = "is not equivalent to addition" + )] + pub fn add(self, sec: i32) -> Self { + self.insert(Add(sec)) + } + + #[must_use] + pub fn subtract(self, sec: i32) -> Self { + self.insert(Subtract(sec)) + } + + #[must_use] + pub fn stringify(self) -> Self { + self.insert(Stringify) + } + + pub fn build(&self) -> Pipeline { + let mut r = Vec::new(); + + self.elements.iter().for_each(|el| r.push(el.runner())); + + Pipeline { runners: r } + } +} + +impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } +} + +pub struct Pipeline { + runners: Vec Outputs>, +} + +impl Pipeline { + pub fn run(&self, inputs: Inputs) -> Outputs { + let mut out: Outputs = inputs.into(); + + for runner in &self.runners { + out = runner(&(&out).into()); + } + + out + } +} From 734a734f0952ebd87506d47f04427674a1fbf50c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 21 Feb 2024 14:24:57 +0100 Subject: [PATCH 154/189] prowocessing: add documentation of trait experiment --- crates/prowocessing/src/experimental.rs | 1 - .../src/experimental/trait_based.rs | 6 +++ .../src/experimental/trait_based/data.rs | 5 +++ .../src/experimental/trait_based/data/io.rs | 9 ++++ .../src/experimental/trait_based/data/raw.rs | 42 ++++++++++++------- .../src/experimental/trait_based/element.rs | 10 ++++- .../src/experimental/trait_based/ops/num.rs | 18 ++++---- .../src/experimental/trait_based/ops/str.rs | 18 ++++---- .../src/experimental/trait_based/pipeline.rs | 21 ++++++++-- 9 files changed, 93 insertions(+), 37 deletions(-) diff --git a/crates/prowocessing/src/experimental.rs b/crates/prowocessing/src/experimental.rs index fcc0d52..1a0f7e3 100644 --- a/crates/prowocessing/src/experimental.rs +++ b/crates/prowocessing/src/experimental.rs @@ -1,3 +1,2 @@ pub mod enum_based; - pub mod trait_based; diff --git a/crates/prowocessing/src/experimental/trait_based.rs b/crates/prowocessing/src/experimental/trait_based.rs index de2fdac..7e742a1 100644 --- a/crates/prowocessing/src/experimental/trait_based.rs +++ b/crates/prowocessing/src/experimental/trait_based.rs @@ -1,3 +1,9 @@ +//! An experiment for a hyper-modular trait-based architecture. +//! +//! Patterns defining this (or well, which I reference a lot while writing this): +//! - [Command pattern using trait objects](https://rust-unofficial.github.io/patterns/patterns/behavioural/command.html) +//! - [Builder pattern](https://rust-unofficial.github.io/patterns/patterns/creational/builder.html) + pub mod data; pub mod element; pub mod ops; diff --git a/crates/prowocessing/src/experimental/trait_based/data.rs b/crates/prowocessing/src/experimental/trait_based/data.rs index cc27567..51ec597 100644 --- a/crates/prowocessing/src/experimental/trait_based/data.rs +++ b/crates/prowocessing/src/experimental/trait_based/data.rs @@ -1,2 +1,7 @@ +//! Definitions of the data transfer and storage types. + +/// Types for element and pipeline IO pub mod io; + +/// Raw data types contained in `io` pub mod raw; diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs index fe40344..849f955 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/io.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -1,29 +1,38 @@ use super::raw::{Data, OwnedData}; +/// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone pub struct Inputs<'a>(Vec>); + impl<'a> Inputs<'a> { + /// get inner value(s) pub(crate) fn inner(&self) -> Vec> { self.0.clone() } } + impl<'a> From>> for Inputs<'a> { fn from(value: Vec>) -> Self { Self(value) } } + impl<'a, T: Into>> From for Inputs<'a> { fn from(value: T) -> Self { Self(vec![value.into()]) } } + impl<'a> From<&'a Outputs> for Inputs<'a> { fn from(value: &'a Outputs) -> Self { Self(value.0.iter().map(std::convert::Into::into).collect()) } } +/// Newtype struct around `OwnedData` for pipeline/element outputs pub struct Outputs(Vec); + impl Outputs { + /// consume self and return inner value(s) pub fn into_inner(self) -> Vec { self.0 } diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs index 88c16e7..e028474 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/raw.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -1,3 +1,25 @@ +//! Dynamic data storage and transfer types + +/// Owned data type, for use mostly in outputs and storage +#[derive(Clone, Debug)] +pub enum OwnedData { + String(String), + Int(i32), +} + +impl From for OwnedData { + fn from(value: String) -> Self { + Self::String(value) + } +} + +impl From for OwnedData { + fn from(value: i32) -> Self { + Self::Int(value) + } +} + +/// Unowned data type, for inputs into runner functions #[derive(Clone, Copy)] pub enum Data<'a> { String(&'a str), @@ -5,6 +27,7 @@ pub enum Data<'a> { } impl Data<'_> { + /// converts itself to `OwnedData` pub fn to_owned_data(&self) -> OwnedData { match self { Data::String(s) => (*s).to_owned().into(), @@ -12,16 +35,19 @@ impl Data<'_> { } } } + impl<'a> From<&'a str> for Data<'a> { fn from(value: &'a str) -> Self { Self::String(value) } } + impl From for Data<'_> { fn from(value: i32) -> Self { Self::Int(value) } } + impl<'a> From<&'a OwnedData> for Data<'a> { fn from(value: &'a OwnedData) -> Self { match value { @@ -30,19 +56,3 @@ impl<'a> From<&'a OwnedData> for Data<'a> { } } } - -#[derive(Clone, Debug)] -pub enum OwnedData { - String(String), - Int(i32), -} -impl From for OwnedData { - fn from(value: String) -> Self { - Self::String(value) - } -} -impl From for OwnedData { - fn from(value: i32) -> Self { - Self::Int(value) - } -} diff --git a/crates/prowocessing/src/experimental/trait_based/element.rs b/crates/prowocessing/src/experimental/trait_based/element.rs index 6fdba6b..b816351 100644 --- a/crates/prowocessing/src/experimental/trait_based/element.rs +++ b/crates/prowocessing/src/experimental/trait_based/element.rs @@ -1,17 +1,23 @@ +//! The trait and type representations + use crate::experimental::trait_based::data::io::Inputs; use super::data::io::Outputs; pub(crate) trait PipelineElement { + /// return a static runner function pointer to avoid dynamic dispatch during pipeline execution - Types MUST match the signature fn runner(&self) -> fn(&Inputs) -> Outputs; - fn signature(&self) -> ElementIo; + /// return the signature of the element + fn signature(&self) -> ElementSignature; } -pub(crate) struct ElementIo { +/// Type signature for an element used for static checking +pub(crate) struct ElementSignature { pub inputs: Vec, pub outputs: Vec, } +/// Data type enum #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum DataType { String, diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index 88b57d3..0b2a295 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -1,3 +1,4 @@ +//! Operations on numeric data use core::panic; use crate::experimental::trait_based::{ @@ -5,9 +6,10 @@ use crate::experimental::trait_based::{ io::{Inputs, Outputs}, raw::Data, }, - element::{DataType, ElementIo, PipelineElement}, + element::{DataType, ElementSignature, PipelineElement}, }; +/// Addition pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -20,14 +22,15 @@ impl PipelineElement for Add { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::Int, DataType::Int], outputs: vec![DataType::Int], } } } +/// Subtraction pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -40,14 +43,15 @@ impl PipelineElement for Subtract { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::Int, DataType::Int], outputs: vec![DataType::Int], } } } +/// Turn input to string pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -60,8 +64,8 @@ impl PipelineElement for Stringify { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::Int], outputs: vec![DataType::String], } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index 56c39ad..38fe992 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -1,11 +1,13 @@ +//! Operation on String/text data use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, raw::Data, }, - element::{DataType, ElementIo, PipelineElement}, + element::{DataType, ElementSignature, PipelineElement}, }; +/// Concatenate the inputs pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -18,14 +20,15 @@ impl PipelineElement for Concatenate { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::String, DataType::String], outputs: vec![DataType::String], } } } +/// Turn input text to uppercase pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -38,14 +41,15 @@ impl PipelineElement for Upper { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::String], outputs: vec![DataType::String], } } } +/// Turn input text to lowercase pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { @@ -58,8 +62,8 @@ impl PipelineElement for Lower { } } - fn signature(&self) -> ElementIo { - ElementIo { + fn signature(&self) -> ElementSignature { + ElementSignature { inputs: vec![DataType::String], outputs: vec![DataType::String], } diff --git a/crates/prowocessing/src/experimental/trait_based/pipeline.rs b/crates/prowocessing/src/experimental/trait_based/pipeline.rs index 628130b..715fda7 100644 --- a/crates/prowocessing/src/experimental/trait_based/pipeline.rs +++ b/crates/prowocessing/src/experimental/trait_based/pipeline.rs @@ -2,21 +2,25 @@ use super::data::io::{Inputs, Outputs}; use super::element::PipelineElement; use super::ops::prelude::*; -// TODO: -// - Bind additional inputs if instruction has more then one and is passd without any additional -// - allow binding to pointers to other pipelines? -// - allow referencing earlier data +/// Builder for the pipelines that are actually run +/// +/// TODO: +/// - Bind additional inputs if instruction has more then one and is passd without any additional +/// - allow binding to pointers to other pipelines? +/// - allow referencing earlier data pub struct PipelineBuilder { elements: Vec>, } impl PipelineBuilder { + /// Create new, empty builder pub fn new() -> Self { Self { elements: Vec::new(), } } + /// Insert element into pipeline fn insert(mut self, el: T) -> Self { if let Some(previous_item) = self.elements.last() { assert_eq!( @@ -28,21 +32,25 @@ impl PipelineBuilder { self } + /// insert string concatenattion element #[must_use] pub fn concatenate(self, sec: String) -> Self { self.insert(Concatenate(sec)) } + /// insert string uppercase element #[must_use] pub fn upper(self) -> Self { self.insert(Upper) } + /// insert string lowercase element #[must_use] pub fn lower(self) -> Self { self.insert(Lower) } + /// insert numeric addition element #[must_use] #[allow( clippy::should_implement_trait, @@ -52,16 +60,19 @@ impl PipelineBuilder { self.insert(Add(sec)) } + /// insert numeric subtraction element #[must_use] pub fn subtract(self, sec: i32) -> Self { self.insert(Subtract(sec)) } + /// insert stringify element #[must_use] pub fn stringify(self) -> Self { self.insert(Stringify) } + /// Build the pipeline. Doesn't check again - `insert` should verify correctness. pub fn build(&self) -> Pipeline { let mut r = Vec::new(); @@ -77,11 +88,13 @@ impl Default for PipelineBuilder { } } +/// Runnable pipeline - at the core of this library pub struct Pipeline { runners: Vec Outputs>, } impl Pipeline { + /// run the pipeline pub fn run(&self, inputs: Inputs) -> Outputs { let mut out: Outputs = inputs.into(); From b7bc0366c2ce59433acb82074bbc5811feab9cfd Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Jul 2024 20:48:56 +0200 Subject: [PATCH 155/189] prowocessing: apply most basic reviews --- crates/app/src/main.rs | 6 ++-- .../src/experimental/trait_based/data.rs | 2 -- .../src/experimental/trait_based/data/io.rs | 32 +++++++++++-------- .../src/experimental/trait_based/data/raw.rs | 32 +++++++++---------- .../src/experimental/trait_based/ops/num.rs | 8 ++--- .../src/experimental/trait_based/ops/str.rs | 8 ++--- 6 files changed, 46 insertions(+), 42 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index d5a260c..ffd7271 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -27,7 +27,7 @@ enum Commands { }, Dev { #[command(subcommand)] - dev_command: DevCommands, + command: DevCommands, }, } @@ -50,7 +50,9 @@ fn main() { machine.feed(ir); machine.eval_full(); } - Commands::Dev { dev_command } => dev_command.run(), + Commands::Dev { + command: dev_command, + } => dev_command.run(), } } diff --git a/crates/prowocessing/src/experimental/trait_based/data.rs b/crates/prowocessing/src/experimental/trait_based/data.rs index 51ec597..e3dd671 100644 --- a/crates/prowocessing/src/experimental/trait_based/data.rs +++ b/crates/prowocessing/src/experimental/trait_based/data.rs @@ -1,7 +1,5 @@ //! Definitions of the data transfer and storage types. -/// Types for element and pipeline IO pub mod io; -/// Raw data types contained in `io` pub mod raw; diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs index 849f955..d091621 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/io.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -1,22 +1,26 @@ -use super::raw::{Data, OwnedData}; +//! Types for element and pipeline IO + +use std::convert::Into; + +use super::raw::{Data, DataRef}; /// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone -pub struct Inputs<'a>(Vec>); +pub struct Inputs<'a>(Vec>); impl<'a> Inputs<'a> { /// get inner value(s) - pub(crate) fn inner(&self) -> Vec> { + pub(crate) fn inner(&self) -> Vec> { self.0.clone() } } -impl<'a> From>> for Inputs<'a> { - fn from(value: Vec>) -> Self { +impl<'a> From>> for Inputs<'a> { + fn from(value: Vec>) -> Self { Self(value) } } -impl<'a, T: Into>> From for Inputs<'a> { +impl<'a, T: Into>> From for Inputs<'a> { fn from(value: T) -> Self { Self(vec![value.into()]) } @@ -24,25 +28,25 @@ impl<'a, T: Into>> From for Inputs<'a> { impl<'a> From<&'a Outputs> for Inputs<'a> { fn from(value: &'a Outputs) -> Self { - Self(value.0.iter().map(std::convert::Into::into).collect()) + Self(value.0.iter().map(Into::into).collect()) } } -/// Newtype struct around `OwnedData` for pipeline/element outputs -pub struct Outputs(Vec); +/// Used for pipeline/element outputs +pub struct Outputs(Vec); impl Outputs { /// consume self and return inner value(s) - pub fn into_inner(self) -> Vec { + pub fn into_inner(self) -> Vec { self.0 } } -impl From> for Outputs { - fn from(value: Vec) -> Self { +impl From> for Outputs { + fn from(value: Vec) -> Self { Self(value) } } -impl> From for Outputs { +impl> From for Outputs { fn from(value: T) -> Self { Self(vec![value.into()]) } @@ -53,7 +57,7 @@ impl From> for Outputs { value .0 .into_iter() - .map(|i: Data<'_>| Data::to_owned_data(&i)) + .map(|i: DataRef<'_>| DataRef::to_owned_data(&i)) .collect(), ) } diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs index e028474..acc75c1 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/raw.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -1,58 +1,58 @@ -//! Dynamic data storage and transfer types +//! Dynamic data storage and transfer types for use in [`io`] /// Owned data type, for use mostly in outputs and storage #[derive(Clone, Debug)] -pub enum OwnedData { +pub enum Data { String(String), Int(i32), } -impl From for OwnedData { +impl From for Data { fn from(value: String) -> Self { Self::String(value) } } -impl From for OwnedData { +impl From for Data { fn from(value: i32) -> Self { Self::Int(value) } } /// Unowned data type, for inputs into runner functions -#[derive(Clone, Copy)] -pub enum Data<'a> { +#[derive(Clone, Copy, Debug)] +pub enum DataRef<'a> { String(&'a str), Int(i32), } -impl Data<'_> { +impl DataRef<'_> { /// converts itself to `OwnedData` - pub fn to_owned_data(&self) -> OwnedData { + pub fn to_owned_data(&self) -> Data { match self { - Data::String(s) => (*s).to_owned().into(), - Data::Int(i) => (*i).into(), + DataRef::String(s) => (*s).to_owned().into(), + DataRef::Int(i) => (*i).into(), } } } -impl<'a> From<&'a str> for Data<'a> { +impl<'a> From<&'a str> for DataRef<'a> { fn from(value: &'a str) -> Self { Self::String(value) } } -impl From for Data<'_> { +impl From for DataRef<'_> { fn from(value: i32) -> Self { Self::Int(value) } } -impl<'a> From<&'a OwnedData> for Data<'a> { - fn from(value: &'a OwnedData) -> Self { +impl<'a> From<&'a Data> for DataRef<'a> { + fn from(value: &'a Data) -> Self { match value { - OwnedData::String(s) => Data::String(s), - OwnedData::Int(i) => Data::Int(*i), + Data::String(s) => DataRef::String(s), + Data::Int(i) => DataRef::Int(*i), } } } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index 0b2a295..09b4372 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -4,7 +4,7 @@ use core::panic; use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, - raw::Data, + raw::DataRef, }, element::{DataType, ElementSignature, PipelineElement}, }; @@ -14,7 +14,7 @@ pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + if let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] { (i0 + i1).into() } else { panic!("Invalid data passed") @@ -35,7 +35,7 @@ pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(i0), Data::Int(i1), ..] = input.inner()[..] { + if let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] { (i0 + i1).into() } else { panic!("Invalid data passed") @@ -56,7 +56,7 @@ pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::Int(int), ..] = input.inner()[..] { + if let [DataRef::Int(int), ..] = input.inner()[..] { int.to_string().into() } else { panic!("Invalid data passed") diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index 38fe992..dc0d99d 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -2,7 +2,7 @@ use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, - raw::Data, + raw::DataRef, }, element::{DataType, ElementSignature, PipelineElement}, }; @@ -12,7 +12,7 @@ pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s0), Data::String(s1), ..] = input.inner()[..] { + if let [DataRef::String(s0), DataRef::String(s1), ..] = input.inner()[..] { format!("{s0}{s1}").into() } else { panic!("Invalid data passed") @@ -33,7 +33,7 @@ pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s), ..] = input.inner()[..] { + if let [DataRef::String(s), ..] = input.inner()[..] { s.to_uppercase().into() } else { panic!("Invalid data passed") @@ -54,7 +54,7 @@ pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [Data::String(s), ..] = input.inner()[..] { + if let [DataRef::String(s), ..] = input.inner()[..] { s.to_lowercase().into() } else { panic!("Invalid data passed") From 619b7acf94e26efd2c3a0df935c66e3dc4ec8e92 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 23 Feb 2024 12:11:35 +0100 Subject: [PATCH 156/189] prowocessing: let-else refatoring as according to review --- .../src/experimental/trait_based/ops/num.rs | 21 ++++++++----------- .../src/experimental/trait_based/ops/str.rs | 21 ++++++++----------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index 09b4372..a6ac18c 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -14,11 +14,10 @@ pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { + let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + (i0 + i1).into() } } @@ -35,11 +34,10 @@ pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] { - (i0 + i1).into() - } else { + let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + (i0 + i1).into() } } @@ -56,11 +54,10 @@ pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::Int(int), ..] = input.inner()[..] { - int.to_string().into() - } else { + let [DataRef::Int(int), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + int.to_string().into() } } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index dc0d99d..49ce606 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -12,11 +12,10 @@ pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::String(s0), DataRef::String(s1), ..] = input.inner()[..] { - format!("{s0}{s1}").into() - } else { + let [DataRef::String(s0), DataRef::String(s1), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + format!("{s0}{s1}").into() } } @@ -33,11 +32,10 @@ pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::String(s), ..] = input.inner()[..] { - s.to_uppercase().into() - } else { + let [DataRef::String(s), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + s.to_uppercase().into() } } @@ -54,11 +52,10 @@ pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - if let [DataRef::String(s), ..] = input.inner()[..] { - s.to_lowercase().into() - } else { + let [DataRef::String(s), ..] = input.inner()[..] else { panic!("Invalid data passed") - } + }; + s.to_lowercase().into() } } From 911339fc2ae3c1e1e71c7ae1480b35f053f6a94f Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 23 Feb 2024 12:46:39 +0100 Subject: [PATCH 157/189] simplified by entirely removing `DataRef` --- crates/app/src/main.rs | 3 +- crates/eval/src/lib.rs | 2 +- .../src/experimental/trait_based/data/io.rs | 27 ++++--------- .../src/experimental/trait_based/data/raw.rs | 40 +------------------ .../src/experimental/trait_based/ops/num.rs | 8 ++-- .../src/experimental/trait_based/ops/str.rs | 8 ++-- 6 files changed, 19 insertions(+), 69 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index ffd7271..7780bbb 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -87,7 +87,8 @@ mod dev { let pipe = PipelineBuilder::new().add(1).stringify().build(); println!( "{:?}", - pipe.run(vec![num0.into(), num1.into()].into()).into_inner()[0] + pipe.run(vec![&num0.into(), &num1.into()].into()) + .into_inner()[0] ); } } diff --git a/crates/eval/src/lib.rs b/crates/eval/src/lib.rs index c3a6c38..8687d91 100644 --- a/crates/eval/src/lib.rs +++ b/crates/eval/src/lib.rs @@ -37,7 +37,7 @@ impl Available { #[must_use] pub fn pick(&self) -> Box { match self { - Self::Debug => Box::new(kind::debug::Evaluator::default()), + Self::Debug => Box::::default(), } } } diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs index d091621..59e2f28 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/io.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -1,26 +1,19 @@ //! Types for element and pipeline IO -use std::convert::Into; +use std::{borrow::ToOwned, convert::Into}; -use super::raw::{Data, DataRef}; +use super::raw::Data; /// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone -pub struct Inputs<'a>(Vec>); +pub struct Inputs<'a>(pub Vec<&'a Data>); -impl<'a> Inputs<'a> { - /// get inner value(s) - pub(crate) fn inner(&self) -> Vec> { - self.0.clone() - } -} - -impl<'a> From>> for Inputs<'a> { - fn from(value: Vec>) -> Self { +impl<'a> From> for Inputs<'a> { + fn from(value: Vec<&'a Data>) -> Self { Self(value) } } -impl<'a, T: Into>> From for Inputs<'a> { +impl<'a, T: Into<&'a Data>> From for Inputs<'a> { fn from(value: T) -> Self { Self(vec![value.into()]) } @@ -53,12 +46,6 @@ impl> From for Outputs { } impl From> for Outputs { fn from(value: Inputs) -> Self { - Self( - value - .0 - .into_iter() - .map(|i: DataRef<'_>| DataRef::to_owned_data(&i)) - .collect(), - ) + Self(value.0.into_iter().map(ToOwned::to_owned).collect()) } } diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs index acc75c1..502bb91 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/raw.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -1,6 +1,6 @@ //! Dynamic data storage and transfer types for use in [`io`] -/// Owned data type, for use mostly in outputs and storage +// Dynamic data type #[derive(Clone, Debug)] pub enum Data { String(String), @@ -18,41 +18,3 @@ impl From for Data { Self::Int(value) } } - -/// Unowned data type, for inputs into runner functions -#[derive(Clone, Copy, Debug)] -pub enum DataRef<'a> { - String(&'a str), - Int(i32), -} - -impl DataRef<'_> { - /// converts itself to `OwnedData` - pub fn to_owned_data(&self) -> Data { - match self { - DataRef::String(s) => (*s).to_owned().into(), - DataRef::Int(i) => (*i).into(), - } - } -} - -impl<'a> From<&'a str> for DataRef<'a> { - fn from(value: &'a str) -> Self { - Self::String(value) - } -} - -impl From for DataRef<'_> { - fn from(value: i32) -> Self { - Self::Int(value) - } -} - -impl<'a> From<&'a Data> for DataRef<'a> { - fn from(value: &'a Data) -> Self { - match value { - Data::String(s) => DataRef::String(s), - Data::Int(i) => DataRef::Int(*i), - } - } -} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index a6ac18c..1a0a701 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -4,7 +4,7 @@ use core::panic; use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, - raw::DataRef, + raw::Data, }, element::{DataType, ElementSignature, PipelineElement}, }; @@ -14,7 +14,7 @@ pub struct Add(pub i32); impl PipelineElement for Add { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { panic!("Invalid data passed") }; (i0 + i1).into() @@ -34,7 +34,7 @@ pub struct Subtract(pub i32); impl PipelineElement for Subtract { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::Int(i0), DataRef::Int(i1), ..] = input.inner()[..] else { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { panic!("Invalid data passed") }; (i0 + i1).into() @@ -54,7 +54,7 @@ pub struct Stringify; impl PipelineElement for Stringify { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::Int(int), ..] = input.inner()[..] else { + let [Data::Int(int), ..] = input.0[..] else { panic!("Invalid data passed") }; int.to_string().into() diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index 49ce606..01fd25a 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -2,7 +2,7 @@ use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, - raw::DataRef, + raw::Data, }, element::{DataType, ElementSignature, PipelineElement}, }; @@ -12,7 +12,7 @@ pub struct Concatenate(pub String); impl PipelineElement for Concatenate { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::String(s0), DataRef::String(s1), ..] = input.inner()[..] else { + let [Data::String(s0), Data::String(s1), ..] = input.0[..] else { panic!("Invalid data passed") }; format!("{s0}{s1}").into() @@ -32,7 +32,7 @@ pub struct Upper; impl PipelineElement for Upper { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::String(s), ..] = input.inner()[..] else { + let [Data::String(s), ..] = input.0[..] else { panic!("Invalid data passed") }; s.to_uppercase().into() @@ -52,7 +52,7 @@ pub struct Lower; impl PipelineElement for Lower { fn runner(&self) -> fn(&Inputs) -> Outputs { |input| { - let [DataRef::String(s), ..] = input.inner()[..] else { + let [Data::String(s), ..] = input.0[..] else { panic!("Invalid data passed") }; s.to_lowercase().into() From 31a044577a59617c79649de297f2468336d5e1aa Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 26 Feb 2024 12:36:57 +0100 Subject: [PATCH 158/189] experimentation: use dynamic type ids for signatures and add qol macro --- .../src/experimental/trait_based.rs | 1 + .../src/experimental/trait_based/element.rs | 18 +++++++++++------- .../src/experimental/trait_based/ops/num.rs | 18 +++++------------- .../src/experimental/trait_based/ops/str.rs | 17 ++++------------- 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/crates/prowocessing/src/experimental/trait_based.rs b/crates/prowocessing/src/experimental/trait_based.rs index 7e742a1..251fb35 100644 --- a/crates/prowocessing/src/experimental/trait_based.rs +++ b/crates/prowocessing/src/experimental/trait_based.rs @@ -5,6 +5,7 @@ //! - [Builder pattern](https://rust-unofficial.github.io/patterns/patterns/creational/builder.html) pub mod data; +#[macro_use] pub mod element; pub mod ops; pub mod pipeline; diff --git a/crates/prowocessing/src/experimental/trait_based/element.rs b/crates/prowocessing/src/experimental/trait_based/element.rs index b816351..b07c739 100644 --- a/crates/prowocessing/src/experimental/trait_based/element.rs +++ b/crates/prowocessing/src/experimental/trait_based/element.rs @@ -1,5 +1,7 @@ //! The trait and type representations +use std::any::TypeId; + use crate::experimental::trait_based::data::io::Inputs; use super::data::io::Outputs; @@ -13,13 +15,15 @@ pub(crate) trait PipelineElement { /// Type signature for an element used for static checking pub(crate) struct ElementSignature { - pub inputs: Vec, - pub outputs: Vec, + pub inputs: Vec, + pub outputs: Vec, } -/// Data type enum -#[derive(Clone, Copy, PartialEq, Eq, Debug)] -pub enum DataType { - String, - Int, +macro_rules! signature { + ($($inputs:ty),+ => $($outputs:ty),+) => ( + ElementSignature { + inputs: vec![$(std::any::TypeId::of::<$inputs>(), )+], + outputs: vec![$(std::any::TypeId::of::<$outputs>(), )+] + } + ) } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs index 1a0a701..ea189bf 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/num.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -1,12 +1,13 @@ //! Operations on numeric data use core::panic; +use std::any::TypeId; use crate::experimental::trait_based::{ data::{ io::{Inputs, Outputs}, raw::Data, }, - element::{DataType, ElementSignature, PipelineElement}, + element::{ElementSignature, PipelineElement}, }; /// Addition @@ -22,10 +23,7 @@ impl PipelineElement for Add { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::Int, DataType::Int], - outputs: vec![DataType::Int], - } + signature!(i32, i32 => i32) } } @@ -42,10 +40,7 @@ impl PipelineElement for Subtract { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::Int, DataType::Int], - outputs: vec![DataType::Int], - } + signature!(i32, i32 => i32) } } @@ -62,9 +57,6 @@ impl PipelineElement for Stringify { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::Int], - outputs: vec![DataType::String], - } + signature!(i32 => String) } } diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs index 01fd25a..fb59ada 100644 --- a/crates/prowocessing/src/experimental/trait_based/ops/str.rs +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -4,7 +4,7 @@ use crate::experimental::trait_based::{ io::{Inputs, Outputs}, raw::Data, }, - element::{DataType, ElementSignature, PipelineElement}, + element::{ElementSignature, PipelineElement}, }; /// Concatenate the inputs @@ -20,10 +20,7 @@ impl PipelineElement for Concatenate { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::String, DataType::String], - outputs: vec![DataType::String], - } + signature!(String, String => String) } } @@ -40,10 +37,7 @@ impl PipelineElement for Upper { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::String], - outputs: vec![DataType::String], - } + signature!(String => String) } } @@ -60,9 +54,6 @@ impl PipelineElement for Lower { } fn signature(&self) -> ElementSignature { - ElementSignature { - inputs: vec![DataType::String], - outputs: vec![DataType::String], - } + signature!(String => String) } } From 0705702d4a8eb54a567fa0e71ec25c028165571d Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 27 Feb 2024 13:13:18 +0100 Subject: [PATCH 159/189] experimentation: implement some basic traits for io and data types --- crates/prowocessing/src/experimental/trait_based/data/io.rs | 4 +++- crates/prowocessing/src/experimental/trait_based/data/raw.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs index 59e2f28..4eb9bd3 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/io.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -5,6 +5,7 @@ use std::{borrow::ToOwned, convert::Into}; use super::raw::Data; /// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone +#[derive(PartialEq, Eq, Debug)] pub struct Inputs<'a>(pub Vec<&'a Data>); impl<'a> From> for Inputs<'a> { @@ -26,7 +27,8 @@ impl<'a> From<&'a Outputs> for Inputs<'a> { } /// Used for pipeline/element outputs -pub struct Outputs(Vec); +#[derive(PartialEq, Eq, Debug)] +pub struct Outputs(pub Vec); impl Outputs { /// consume self and return inner value(s) diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs index 502bb91..6640e64 100644 --- a/crates/prowocessing/src/experimental/trait_based/data/raw.rs +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -1,7 +1,7 @@ //! Dynamic data storage and transfer types for use in [`io`] // Dynamic data type -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Data { String(String), Int(i32), From 18309ec919665c02ed361780cba596c7079044cb Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 27 Feb 2024 13:14:00 +0100 Subject: [PATCH 160/189] app, prowocessing: move dev commands to tests --- crates/app/src/main.rs | 31 ++--------------------------- crates/prowocessing/src/lib.rs | 36 ++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 7780bbb..9c7c0de 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -60,38 +60,11 @@ mod dev { use clap::Subcommand; #[derive(Subcommand)] - pub(crate) enum DevCommands { - Enums { test_str: String }, - Add { num0: i32, num1: i32 }, - } + pub(crate) enum DevCommands {} impl DevCommands { pub fn run(self) { - match self { - DevCommands::Enums { test_str } => { - use prowocessing::experimental::enum_based::PipelineBuilder; - - let upr = PipelineBuilder::new() - .insert(prowocessing::experimental::enum_based::Instruction::Uppercase) - .build(); - let lwr = PipelineBuilder::new() - .insert(prowocessing::experimental::enum_based::Instruction::Lowercase) - .build(); - - println!("Upr: {}", upr.run(test_str.clone())); - println!("Lwr: {}", lwr.run(test_str.clone())); - } - DevCommands::Add { num0, num1 } => { - use prowocessing::experimental::trait_based::pipeline::PipelineBuilder; - - let pipe = PipelineBuilder::new().add(1).stringify().build(); - println!( - "{:?}", - pipe.run(vec![&num0.into(), &num1.into()].into()) - .into_inner()[0] - ); - } - } + println!("There are currently no dev commands."); } } } diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs index aa81057..083eb4f 100644 --- a/crates/prowocessing/src/lib.rs +++ b/crates/prowocessing/src/lib.rs @@ -8,13 +8,33 @@ /// Gonna first try string processing... pub mod experimental; -#[test] -fn test_enums() { - use crate::experimental::enum_based::{Instruction, PipelineBuilder}; - let builder = PipelineBuilder::new().insert(Instruction::Uppercase); - let upr = builder.build(); - let upr_lowr = builder.insert(Instruction::Lowercase).build(); +#[cfg(test)] +mod tests { + use crate::experimental::{ + enum_based, + trait_based::{self, data::io::Outputs}, + }; - assert_eq!(upr.run(String::from("Test")), String::from("TEST")); - assert_eq!(upr_lowr.run(String::from("Test")), String::from("test")); + #[test] + fn test_enums() { + let builder = enum_based::PipelineBuilder::new().insert(enum_based::Instruction::Uppercase); + let upr = builder.build(); + let upr_lowr = builder.insert(enum_based::Instruction::Lowercase).build(); + + assert_eq!(upr.run(String::from("Test")), String::from("TEST")); + assert_eq!(upr_lowr.run(String::from("Test")), String::from("test")); + } + + #[test] + fn add() { + let pipe = trait_based::pipeline::PipelineBuilder::new() + .add(0) + .stringify() + .build(); + + assert_eq!( + pipe.run(vec![&2.into(), &3.into()].into()), + Outputs(vec![String::from("5").into()]) + ); + } } From 54401d2a21b83a25f2f28cca90220c153cad0f11 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 27 Feb 2024 13:18:01 +0100 Subject: [PATCH 161/189] app: apply review --- crates/app/src/config.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index 552a951..17cd39c 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -14,11 +14,16 @@ pub struct Config { impl Config { /// Get the configs from all possible places (args, file, env...) pub fn read(args: &CliConfigs) -> Self { - let config = if let Some(config) = &args.config_path { - Ok(config.clone()) - } else { - find_config_file() - }; + // let config = if let Some(config) = &args.config_path { + // Ok(config.clone()) + // } else { + // find_config_file() + // }; + let config = args + .config_path + .clone() + .ok_or(()) + .or_else(|()| find_config_file()); // try to read a maybe existing config file let config = config.ok().and_then(|path| { From ccc6d4f532b4c703d7f835918ae55200e6996a84 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 8 Jul 2024 20:51:51 +0200 Subject: [PATCH 162/189] update/fix cargo.lock --- Cargo.lock | 469 ++++++++++++++++++++++++----------------------------- 1 file changed, 211 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 123e4ca..cc6fd8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,47 +10,48 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -84,9 +85,9 @@ dependencies = [ [[package]] name = "ariadne" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd002a6223f12c7a95cdd4b1cb3a0149d22d37f7a9ecdb2cb691a071fe236c29" +checksum = "44055e597c674aef7cb903b2b9f6e4cba1277ed0d2d61dae7cd52d7ffa81f8e2" dependencies = [ "unicode-width", "yansi", @@ -94,15 +95,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "beef" @@ -124,18 +125,24 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] [[package]] -name = "bytemuck" -version = "1.14.0" +name = "by_address" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" [[package]] name = "byteorder" @@ -151,9 +158,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.12" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -161,9 +168,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.12" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -173,9 +180,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck", "proc-macro2", @@ -185,9 +192,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "color_quant" @@ -197,9 +204,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "countme" @@ -209,9 +216,9 @@ checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -240,23 +247,20 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] @@ -271,12 +275,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -295,9 +296,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -305,9 +306,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", @@ -318,9 +319,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", @@ -384,9 +385,9 @@ checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "enumset" @@ -427,9 +428,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.71.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", @@ -449,9 +450,9 @@ checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" [[package]] name = "fdeflate" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -464,9 +465,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -489,9 +490,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -500,9 +501,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -510,24 +511,25 @@ dependencies = [ [[package]] name = "half" -version = "2.2.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ + "cfg-if", "crunchy", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -543,9 +545,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.8" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -597,21 +599,27 @@ dependencies = [ [[package]] name = "is_ci" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] @@ -638,9 +646,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" @@ -656,20 +664,19 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", ] [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -710,9 +717,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -725,28 +732,34 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", ] [[package]] -name = "num-traits" -version = "0.2.17" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -772,6 +785,30 @@ dependencies = [ "supports-color", ] +[[package]] +name = "palette" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +dependencies = [ + "approx", + "fast-srgb8", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "parking_lot_core" version = "0.9.10" @@ -780,16 +817,16 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap", @@ -837,76 +874,11 @@ dependencies = [ "siphasher", ] -[[package]] -name = "palette" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d38e6e5ca1612e2081cc31188f08c3cba630ce4ba44709a153f1a0f38d678f2" -dependencies = [ - "approx", - "fast-srgb8", - "palette_derive", - "phf", -] - -[[package]] -name = "palette_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05d1c929301fee6830dafa764341118829b2535c216b0571e3821ecac5c885b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - [[package]] name = "png" -version = "0.17.10" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -923,9 +895,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -959,9 +931,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -969,24 +941,6 @@ dependencies = [ [[package]] name = "rand" version = "0.8.5" -<<<<<<< HEAD -======= -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "rayon" -version = "1.8.0" ->>>>>>> 1d85252 (processing library: init) source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ @@ -1021,27 +975,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -1050,9 +995,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "ron" @@ -1061,7 +1006,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64", - "bitflags 2.4.1", + "bitflags 2.6.0", "serde", "serde_derive", ] @@ -1087,9 +1032,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scopeguard" @@ -1099,18 +1044,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", @@ -1119,9 +1064,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.109" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -1142,9 +1087,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spin" @@ -1166,9 +1111,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "supports-color" @@ -1192,9 +1137,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" dependencies = [ "proc-macro2", "quote", @@ -1209,18 +1154,18 @@ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" [[package]] name = "thiserror" -version = "1.0.55" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.55" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", @@ -1229,9 +1174,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -1240,12 +1185,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -1266,15 +1212,15 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "vte" @@ -1304,9 +1250,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "weezl" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "windows-sys" @@ -1323,7 +1269,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -1343,17 +1289,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1364,9 +1311,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1376,9 +1323,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1388,9 +1335,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -1400,9 +1353,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1412,9 +1365,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1424,9 +1377,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -1436,15 +1389,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zune-inflate" From 3412eb939518d5fe7b6d32788a2bcbf13703af48 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 18 Jul 2024 19:12:58 +0200 Subject: [PATCH 163/189] executor (poc): init proof of concept executor crate --- Cargo.lock | 4 ++++ Cargo.toml | 3 ++- crates/executor-poc/Cargo.toml | 9 +++++++++ crates/executor-poc/src/lib.rs | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 crates/executor-poc/Cargo.toml create mode 100644 crates/executor-poc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index cc6fd8b..40d5db7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -426,6 +426,10 @@ dependencies = [ "serde", ] +[[package]] +name = "executor-poc" +version = "0.1.0" + [[package]] name = "exr" version = "1.72.0" diff --git a/Cargo.toml b/Cargo.toml index 83becd3..6b774ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,8 @@ members = [ "crates/ir", "crates/lang", "crates/svg-filters", - "crates/prowocessing", + "crates/prowocessing", + "crates/executor-poc", ] resolver = "2" diff --git a/crates/executor-poc/Cargo.toml b/crates/executor-poc/Cargo.toml new file mode 100644 index 0000000..5b0954f --- /dev/null +++ b/crates/executor-poc/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "executor-poc" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[lints] +workspace = true diff --git a/crates/executor-poc/src/lib.rs b/crates/executor-poc/src/lib.rs new file mode 100644 index 0000000..7d12d9a --- /dev/null +++ b/crates/executor-poc/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: usize, right: usize) -> usize { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} From a693b5744789e69d175c11980acbcc60eed5699a Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 10 Oct 2024 10:23:54 +0200 Subject: [PATCH 164/189] yet another attempt at building an evaluator --- Cargo.lock | 658 ++++++++++++++++++++++++++++++++- crates/executor-poc/Cargo.toml | 4 + crates/executor-poc/src/lib.rs | 132 ++++++- 3 files changed, 783 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40d5db7..25bef26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "anstream" version = "0.6.14" @@ -57,6 +63,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + [[package]] name = "app" version = "0.1.0" @@ -83,6 +95,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ariadne" version = "0.4.1" @@ -93,12 +122,41 @@ dependencies = [ "yansi", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.21.7" @@ -132,6 +190,24 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcde5f311c85b8ca30c2e4198d4326bc342c76541590106f5fa4a50946ea499" + +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "by_address" version = "1.2.1" @@ -150,6 +226,32 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -421,7 +523,7 @@ name = "eval" version = "0.1.0" dependencies = [ "clap", - "image", + "image 0.24.9", "ir", "serde", ] @@ -429,6 +531,12 @@ dependencies = [ [[package]] name = "executor-poc" version = "0.1.0" +dependencies = [ + "image 0.25.1", + "indexmap", + "nalgebra", + "petgraph", +] [[package]] name = "exr" @@ -565,6 +673,45 @@ dependencies = [ "tiff", ] +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "2.2.6" @@ -581,6 +728,17 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ir" version = "0.1.0" @@ -613,12 +771,30 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.3.1" @@ -666,6 +842,17 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libredox" version = "0.1.3" @@ -686,6 +873,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + [[package]] name = "logos" version = "0.14.0" @@ -719,6 +912,35 @@ dependencies = [ "logos-codegen", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -734,6 +956,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -744,12 +972,111 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "nalgebra" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c4b5f057b303842cf3262c27e465f4c303572e7f6b0648f60e16248ac3397f4" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -826,6 +1153,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "petgraph" version = "0.6.5" @@ -878,6 +1211,12 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "png" version = "0.17.13" @@ -897,6 +1236,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.86" @@ -906,11 +1251,30 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "prowocessing" version = "0.1.0" dependencies = [ - "image", + "image 0.24.9", "palette", ] @@ -923,6 +1287,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.31.0" @@ -948,6 +1318,18 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", "rand_core", ] @@ -956,6 +1338,65 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ba61c28ba24c0cf8406e025cb29a742637e3f70776e61c27a8a8b72a042d12" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" @@ -1003,6 +1444,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rgb" +version = "0.8.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" +dependencies = [ + "bytemuck", +] + [[package]] name = "ron" version = "0.8.1" @@ -1040,6 +1490,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "safe_arch" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +dependencies = [ + "bytemuck", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -1077,12 +1536,43 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -1150,6 +1640,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" + [[package]] name = "text-size" version = "1.1.1" @@ -1208,6 +1717,46 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +[[package]] +name = "toml" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -1226,6 +1775,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "vte" version = "0.11.1" @@ -1252,12 +1818,76 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + [[package]] name = "weezl" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "wide" +version = "0.7.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2caba658a80831539b30698ae9862a72db6697dfdd7151e46920f5f2755c3ce2" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1397,12 +2027,27 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -1411,3 +2056,12 @@ checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/crates/executor-poc/Cargo.toml b/crates/executor-poc/Cargo.toml index 5b0954f..563b1aa 100644 --- a/crates/executor-poc/Cargo.toml +++ b/crates/executor-poc/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] +image = "0.25.1" +indexmap = "2.2.6" +nalgebra = "0.33.0" +petgraph.workspace = true [lints] workspace = true diff --git a/crates/executor-poc/src/lib.rs b/crates/executor-poc/src/lib.rs index 7d12d9a..e5c703e 100644 --- a/crates/executor-poc/src/lib.rs +++ b/crates/executor-poc/src/lib.rs @@ -1,14 +1,128 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right +use indexmap::IndexMap; +use instructions::Instruction; +use petgraph::graph::DiGraph; +use types::Type; + +trait Node { + fn inputs() -> IndexMap; + fn outputs() -> IndexMap; } -#[cfg(test)] -mod tests { - use super::*; +struct NodeGraph { + graph: DiGraph, +} - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); +struct TypedEdge { + from: String, + to: String, + typ: Type, +} + +mod instructions { + //! This is the lowest level of the IR, the one the executor will use. + + use std::path::Path; + + use indexmap::{indexmap, IndexMap}; + pub enum Instruction { + // File handling + LoadFile, + SaveFile, + + ColorMatrix, + PosMatrix, + + Blend, + SplitChannels, + } + + impl Instruction { + fn inputs(&self) -> IndexMap { + match self { + Instruction::LoadFile => indexmap! { + "path" => Type::Path + }, + Instruction::SaveFile => indexmap! { + "path" => Type::Path + }, + + Instruction::ColorMatrix => indexmap! { + "image" => Type::ImageData, + "matrix" => Type::Mat(4,5) + }, + Instruction::PosMatrix => indexmap! { + "image" => Type::ImageData, + "matrix" => Type::Mat(2, 3), + }, + + Instruction::Blend => todo!(), + Instruction::SplitChannels => todo!(), + } + } + fn outputs(&self) -> IndexMap { + match self { + Instruction::LoadFile => indexmap! { + "image" => Type::ImageData + }, + Instruction::SaveFile => indexmap! {}, + + Instruction::ColorMatrix => indexmap! { + "resut" => Type::ImageData + }, + Instruction::PosMatrix => todo!(), + + Instruction::Blend => todo!(), + Instruction::SplitChannels => todo!(), + } + } } } + +mod types { + pub enum Type { + // TODO: later do lower level type system for this stuff? + // Image(Size, PixelType), + // // image data for processing. + // // always PixelType::Rgba32F + // ImageData(Size), + // // stuff that's still to be generated, not sized and no pixeltype + // ProceduralImage, + ImageData, + Text, + Integer, + Float, + Double, + Path, + Bool, + Vec( + // length, + u8, + ), + Mat( + // Rows + u8, + // Columns + u8, + ), + } + + // pub struct Size { + // width: u16, + // height: u16, + // } + + // Pixel types. Taken from variants [here](https://docs.rs/image/latest/image/pub enum.DynamicImage.html). + // pub enum PixelType { + // Luma8, + // LumaA8, + // Rgb8, + // Rgba8, + // Luma16, + // LumaA16, + // Rgb16, + // Rgba16, + // Rgb32F, + // #[default] + // Rgba32F, + // } +} From a3ab844ba7f016e3650e2228a8381aa500ae2add Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 13 Oct 2024 15:32:26 +0200 Subject: [PATCH 165/189] pawarser(init): start extracting the parser lib --- Cargo.lock | 9 +++++++++ Cargo.toml | 2 +- crates/pawarser/Cargo.toml | 12 ++++++++++++ crates/pawarser/src/lib.rs | 39 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 crates/pawarser/Cargo.toml create mode 100644 crates/pawarser/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 25bef26..4304154 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1159,6 +1159,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pawarser" +version = "0.1.0" +dependencies = [ + "drop_bomb", + "enumset", + "rowan", +] + [[package]] name = "petgraph" version = "0.6.5" diff --git a/Cargo.toml b/Cargo.toml index 6b774ed..e5c6dc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ members = [ "crates/lang", "crates/svg-filters", "crates/prowocessing", - "crates/executor-poc", + "crates/executor-poc", "crates/pawarser", ] resolver = "2" diff --git a/crates/pawarser/Cargo.toml b/crates/pawarser/Cargo.toml new file mode 100644 index 0000000..787cb2f --- /dev/null +++ b/crates/pawarser/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "pawarser" +version = "0.1.0" +edition = "2021" + +[dependencies] +rowan = "0.15.15" +drop_bomb = "0.1.5" +enumset = "1.1.3" + +[lints] +workspace = true diff --git a/crates/pawarser/src/lib.rs b/crates/pawarser/src/lib.rs new file mode 100644 index 0000000..f1413cb --- /dev/null +++ b/crates/pawarser/src/lib.rs @@ -0,0 +1,39 @@ +#![feature(iter_collect_into)] +pub mod parser { + pub mod input { + use enumset::{EnumSet, EnumSetType}; + + struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { + raw: &'toks Vec<(SyntaxKind, &'src str)>, + // enumset of meaningless tokens + semantically_meaningless: EnumSet, + // indices of non-meaningless tokens + meaningful_toks: Vec, + } + + impl<'src, 'toks, SyntaxKind: EnumSetType + Into> + Input<'src, 'toks, SyntaxKind> + { + pub fn new( + raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + meaningless: Option>, + ) -> Self { + let mut meaningful_toks = Vec::new(); + + if let Some(meaningless) = meaningless { + let meaningful_toks = raw_toks + .iter() + .enumerate() + .filter_map(|(i, tok)| (!meaningless.contains(tok.0)).then_some(i)) + .collect_into(&mut meaningful_toks); + } + + Self { + raw: raw_toks, + semantically_meaningless: meaningless.unwrap_or_default(), + meaningful_toks, + } + } + } + } +} From ec2ff5778b9161fe5805dade2c517177bd8f27ef Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 13 Oct 2024 16:44:59 +0200 Subject: [PATCH 166/189] pawarser(setup): basic parser stuff and types around it. also, a builder. --- crates/pawarser/src/lib.rs | 129 ++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/crates/pawarser/src/lib.rs b/crates/pawarser/src/lib.rs index f1413cb..16955d1 100644 --- a/crates/pawarser/src/lib.rs +++ b/crates/pawarser/src/lib.rs @@ -1,9 +1,15 @@ #![feature(iter_collect_into)] pub mod parser { + use std::cell::Cell; + + use enumset::{EnumSet, EnumSetType}; + + use self::{error::SyntaxError, event::Event, input::Input}; + pub mod input { use enumset::{EnumSet, EnumSetType}; - struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { + pub struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { raw: &'toks Vec<(SyntaxKind, &'src str)>, // enumset of meaningless tokens semantically_meaningless: EnumSet, @@ -36,4 +42,125 @@ pub mod parser { } } } + mod event { + use enumset::EnumSetType; + + use super::error::SyntaxError; + + pub enum Event, SyntaxErr: SyntaxError> { + Start { + kind: NodeKind, + forward_parent: Option, + }, + Finish, + Eat { + count: usize, + }, + } + + impl, SyntaxErr: SyntaxError> + Event + { + pub fn tombstone() -> Self { + Self::Start { + kind: NodeKind::Tombstone, + forward_parent: None, + } + } + } + + pub enum NodeKind, SyntaxErr: SyntaxError> { + Tombstone, + Syntax(SyntaxKind), + Error(SyntaxErr), + } + + impl, SyntaxErr: SyntaxError> + NodeKind + { + pub fn is_tombstone(&self) -> bool { + matches!(self, Self::Tombstone) + } + pub fn is_syntax(&self) -> bool { + matches!(self, Self::Syntax(_)) + } + pub fn is_error(&self) -> bool { + matches!(self, Self::Error(_)) + } + } + } + mod error { + /// A marker trait... for now! + // TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible + pub trait SyntaxError {} + } + + pub struct Parser< + 'src, + 'toks, + SyntaxKind: EnumSetType + Into, + SyntaxErr: SyntaxError, + > { + input: Input<'src, 'toks, SyntaxKind>, + pos: usize, + events: Vec>, + step_limit: u32, + steps: Cell, + } + + pub struct ParserBuilder< + 'src, + 'toks, + SyntaxKind: EnumSetType + Into, + // SyntaxErr: SyntaxError, + > { + raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + meaningless_token_kinds: EnumSet, + step_limit: u32, + } + + impl<'src, 'toks, SyntaxKind: EnumSetType + Into> + ParserBuilder<'src, 'toks, SyntaxKind> + { + pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { + Self { + raw_toks, + meaningless_token_kinds: EnumSet::new(), + step_limit: 4096, + } + } + + /// Sets the parser step limit. + /// Defaults to 4096 + pub fn step_limit(mut self, new: u32) -> Self { + self.step_limit = new; + self + } + + pub fn add_meaningless(mut self, kind: SyntaxKind) -> Self { + self.meaningless_token_kinds.insert(kind); + self + } + + pub fn add_meaningless_many(mut self, kind: Vec) -> Self { + self.meaningless_token_kinds + .insert_all(kind.into_iter().collect()); + self + } + + pub fn build(self) -> Parser<'src, 'toks, SyntaxKind, SyntaxErr> { + let Self { + raw_toks, + meaningless_token_kinds, + step_limit, + } = self; + Parser { + input: Input::new(raw_toks, Some(meaningless_token_kinds)), + pos: 0, + events: Vec::new(), + step_limit, + steps: Cell::new(0), + } + } + } } From 34ddaacb58d81d235f7f9ed2094ef600cdebc7e3 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 13 Oct 2024 16:47:53 +0200 Subject: [PATCH 167/189] pawarser(chore): split up files --- crates/pawarser/src/lib.rs | 166 +--------------------------- crates/pawarser/src/parser.rs | 78 +++++++++++++ crates/pawarser/src/parser/error.rs | 3 + crates/pawarser/src/parser/event.rs | 45 ++++++++ crates/pawarser/src/parser/input.rs | 34 ++++++ 5 files changed, 161 insertions(+), 165 deletions(-) create mode 100644 crates/pawarser/src/parser.rs create mode 100644 crates/pawarser/src/parser/error.rs create mode 100644 crates/pawarser/src/parser/event.rs create mode 100644 crates/pawarser/src/parser/input.rs diff --git a/crates/pawarser/src/lib.rs b/crates/pawarser/src/lib.rs index 16955d1..92dcd54 100644 --- a/crates/pawarser/src/lib.rs +++ b/crates/pawarser/src/lib.rs @@ -1,166 +1,2 @@ #![feature(iter_collect_into)] -pub mod parser { - use std::cell::Cell; - - use enumset::{EnumSet, EnumSetType}; - - use self::{error::SyntaxError, event::Event, input::Input}; - - pub mod input { - use enumset::{EnumSet, EnumSetType}; - - pub struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { - raw: &'toks Vec<(SyntaxKind, &'src str)>, - // enumset of meaningless tokens - semantically_meaningless: EnumSet, - // indices of non-meaningless tokens - meaningful_toks: Vec, - } - - impl<'src, 'toks, SyntaxKind: EnumSetType + Into> - Input<'src, 'toks, SyntaxKind> - { - pub fn new( - raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, - meaningless: Option>, - ) -> Self { - let mut meaningful_toks = Vec::new(); - - if let Some(meaningless) = meaningless { - let meaningful_toks = raw_toks - .iter() - .enumerate() - .filter_map(|(i, tok)| (!meaningless.contains(tok.0)).then_some(i)) - .collect_into(&mut meaningful_toks); - } - - Self { - raw: raw_toks, - semantically_meaningless: meaningless.unwrap_or_default(), - meaningful_toks, - } - } - } - } - mod event { - use enumset::EnumSetType; - - use super::error::SyntaxError; - - pub enum Event, SyntaxErr: SyntaxError> { - Start { - kind: NodeKind, - forward_parent: Option, - }, - Finish, - Eat { - count: usize, - }, - } - - impl, SyntaxErr: SyntaxError> - Event - { - pub fn tombstone() -> Self { - Self::Start { - kind: NodeKind::Tombstone, - forward_parent: None, - } - } - } - - pub enum NodeKind, SyntaxErr: SyntaxError> { - Tombstone, - Syntax(SyntaxKind), - Error(SyntaxErr), - } - - impl, SyntaxErr: SyntaxError> - NodeKind - { - pub fn is_tombstone(&self) -> bool { - matches!(self, Self::Tombstone) - } - pub fn is_syntax(&self) -> bool { - matches!(self, Self::Syntax(_)) - } - pub fn is_error(&self) -> bool { - matches!(self, Self::Error(_)) - } - } - } - mod error { - /// A marker trait... for now! - // TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible - pub trait SyntaxError {} - } - - pub struct Parser< - 'src, - 'toks, - SyntaxKind: EnumSetType + Into, - SyntaxErr: SyntaxError, - > { - input: Input<'src, 'toks, SyntaxKind>, - pos: usize, - events: Vec>, - step_limit: u32, - steps: Cell, - } - - pub struct ParserBuilder< - 'src, - 'toks, - SyntaxKind: EnumSetType + Into, - // SyntaxErr: SyntaxError, - > { - raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, - meaningless_token_kinds: EnumSet, - step_limit: u32, - } - - impl<'src, 'toks, SyntaxKind: EnumSetType + Into> - ParserBuilder<'src, 'toks, SyntaxKind> - { - pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { - Self { - raw_toks, - meaningless_token_kinds: EnumSet::new(), - step_limit: 4096, - } - } - - /// Sets the parser step limit. - /// Defaults to 4096 - pub fn step_limit(mut self, new: u32) -> Self { - self.step_limit = new; - self - } - - pub fn add_meaningless(mut self, kind: SyntaxKind) -> Self { - self.meaningless_token_kinds.insert(kind); - self - } - - pub fn add_meaningless_many(mut self, kind: Vec) -> Self { - self.meaningless_token_kinds - .insert_all(kind.into_iter().collect()); - self - } - - pub fn build(self) -> Parser<'src, 'toks, SyntaxKind, SyntaxErr> { - let Self { - raw_toks, - meaningless_token_kinds, - step_limit, - } = self; - Parser { - input: Input::new(raw_toks, Some(meaningless_token_kinds)), - pos: 0, - events: Vec::new(), - step_limit, - steps: Cell::new(0), - } - } - } -} +pub mod parser; diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs new file mode 100644 index 0000000..196c776 --- /dev/null +++ b/crates/pawarser/src/parser.rs @@ -0,0 +1,78 @@ +use std::cell::Cell; + +use enumset::{EnumSet, EnumSetType}; + +use self::{error::SyntaxError, event::Event, input::Input}; + +mod error; +mod event; +pub mod input; + +pub struct Parser< + 'src, + 'toks, + SyntaxKind: EnumSetType + Into, + SyntaxErr: SyntaxError, +> { + input: Input<'src, 'toks, SyntaxKind>, + pos: usize, + events: Vec>, + step_limit: u32, + steps: Cell, +} + +pub struct ParserBuilder< + 'src, + 'toks, + SyntaxKind: EnumSetType + Into, + // SyntaxErr: SyntaxError, +> { + raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + meaningless_token_kinds: EnumSet, + step_limit: u32, +} + +impl<'src, 'toks, SyntaxKind: EnumSetType + Into> + ParserBuilder<'src, 'toks, SyntaxKind> +{ + pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { + Self { + raw_toks, + meaningless_token_kinds: EnumSet::new(), + step_limit: 4096, + } + } + + /// Sets the parser step limit. + /// Defaults to 4096 + pub fn step_limit(mut self, new: u32) -> Self { + self.step_limit = new; + self + } + + pub fn add_meaningless(mut self, kind: SyntaxKind) -> Self { + self.meaningless_token_kinds.insert(kind); + self + } + + pub fn add_meaningless_many(mut self, kind: Vec) -> Self { + self.meaningless_token_kinds + .insert_all(kind.into_iter().collect()); + self + } + + pub fn build(self) -> Parser<'src, 'toks, SyntaxKind, SyntaxErr> { + let Self { + raw_toks, + meaningless_token_kinds, + step_limit, + } = self; + Parser { + input: Input::new(raw_toks, Some(meaningless_token_kinds)), + pos: 0, + events: Vec::new(), + step_limit, + steps: Cell::new(0), + } + } +} diff --git a/crates/pawarser/src/parser/error.rs b/crates/pawarser/src/parser/error.rs new file mode 100644 index 0000000..e27c536 --- /dev/null +++ b/crates/pawarser/src/parser/error.rs @@ -0,0 +1,3 @@ +/// A marker trait... for now! +// TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible +pub trait SyntaxError {} diff --git a/crates/pawarser/src/parser/event.rs b/crates/pawarser/src/parser/event.rs new file mode 100644 index 0000000..cb1bed7 --- /dev/null +++ b/crates/pawarser/src/parser/event.rs @@ -0,0 +1,45 @@ +use enumset::EnumSetType; + +use super::error::SyntaxError; + +pub enum Event, SyntaxErr: SyntaxError> { + Start { + kind: NodeKind, + forward_parent: Option, + }, + Finish, + Eat { + count: usize, + }, +} + +impl, SyntaxErr: SyntaxError> + Event +{ + pub fn tombstone() -> Self { + Self::Start { + kind: NodeKind::Tombstone, + forward_parent: None, + } + } +} + +pub enum NodeKind, SyntaxErr: SyntaxError> { + Tombstone, + Syntax(SyntaxKind), + Error(SyntaxErr), +} + +impl, SyntaxErr: SyntaxError> + NodeKind +{ + pub fn is_tombstone(&self) -> bool { + matches!(self, Self::Tombstone) + } + pub fn is_syntax(&self) -> bool { + matches!(self, Self::Syntax(_)) + } + pub fn is_error(&self) -> bool { + matches!(self, Self::Error(_)) + } +} diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs new file mode 100644 index 0000000..b148497 --- /dev/null +++ b/crates/pawarser/src/parser/input.rs @@ -0,0 +1,34 @@ +use enumset::{EnumSet, EnumSetType}; + +pub struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { + raw: &'toks Vec<(SyntaxKind, &'src str)>, + // enumset of meaningless tokens + semantically_meaningless: EnumSet, + // indices of non-meaningless tokens + meaningful_toks: Vec, +} + +impl<'src, 'toks, SyntaxKind: EnumSetType + Into> + Input<'src, 'toks, SyntaxKind> +{ + pub fn new( + raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + meaningless: Option>, + ) -> Self { + let mut meaningful_toks = Vec::new(); + + if let Some(meaningless) = meaningless { + let meaningful_toks = raw_toks + .iter() + .enumerate() + .filter_map(|(i, tok)| (!meaningless.contains(tok.0)).then_some(i)) + .collect_into(&mut meaningful_toks); + } + + Self { + raw: raw_toks, + semantically_meaningless: meaningless.unwrap_or_default(), + meaningful_toks, + } + } +} From 21bcf62ea53d55d89231f39a5b2d811e37ab1ae1 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 17 Oct 2024 09:54:09 +0200 Subject: [PATCH 168/189] pawarser(setup): continue working on the bare basics --- crates/pawarser/src/parser.rs | 95 ++++++++++++++++++++++++---- crates/pawarser/src/parser/error.rs | 6 +- crates/pawarser/src/parser/event.rs | 15 ++--- crates/pawarser/src/parser/input.rs | 32 ++++++++-- crates/pawarser/src/parser/marker.rs | 74 ++++++++++++++++++++++ 5 files changed, 196 insertions(+), 26 deletions(-) create mode 100644 crates/pawarser/src/parser/marker.rs diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 196c776..0bac65a 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -2,18 +2,25 @@ use std::cell::Cell; use enumset::{EnumSet, EnumSetType}; -use self::{error::SyntaxError, event::Event, input::Input}; +use self::{error::SyntaxError, event::Event, input::Input, marker::Marker}; mod error; mod event; -pub mod input; +mod input; +mod marker; -pub struct Parser< - 'src, - 'toks, - SyntaxKind: EnumSetType + Into, - SyntaxErr: SyntaxError, -> { +/// this is used to define some required SyntaxKinds like an EOF token or an error token +pub trait SyntaxElement +where + Self: EnumSetType + Into + Clone, +{ + /// EOF value. This will be used by the rest of the parser library to represent an EOF. + const EOF: Self; + /// Error value. This will be used as a placeholder for associated respective errors. + const ERROR: Self; +} + +pub struct Parser<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> { input: Input<'src, 'toks, SyntaxKind>, pos: usize, events: Vec>, @@ -21,10 +28,76 @@ pub struct Parser< steps: Cell, } +impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> + Parser<'src, 'toks, SyntaxKind, SyntaxErr> +{ + /// eat all meaningless tokens at the end of the file. + pub fn eat_succeeding_meaningless(&mut self) { + self.push_ev(Event::Eat { + count: self.input.meaningless_tail_len(), + }); + } + + /// Get token from current position of the parser. + pub fn current(&self) -> SyntaxKind { + self.step(); + self.input.kind(self.pos) + } + + pub fn start(&mut self, name: &str) -> Marker { + let pos = self.events.len(); + self.push_ev(Event::tombstone()); + Marker::new(pos, name) + } + + /// Eat next token if it's of kind `kind` and return `true`. + /// Otherwise, `false`. + pub fn eat(&mut self, kind: SyntaxKind) -> bool { + if !self.at(kind) { + return false; + } + + self.do_bump(); + true + } + + fn do_bump(&mut self) { + self.push_ev(Event::Eat { + count: self.input.preceding_meaningless(self.pos), + }); + self.pos += 1; + } + + /// Check if the token at the current parser position is of `kind` + pub fn at(&self, kind: SyntaxKind) -> bool { + self.nth_at(0, kind) + } + + /// Check if the token that is `n` ahead is of `kind` + pub fn nth_at(&self, n: usize, kind: SyntaxKind) -> bool { + self.nth(n) == kind + } + + pub fn nth(&self, n: usize) -> SyntaxKind { + self.step(); + self.input.kind(self.pos + n) + } + + fn push_ev(&mut self, event: Event) { + self.events.push(event); + } + + fn step(&self) { + let steps = self.steps.get(); + assert!(steps <= self.step_limit, "the parser seems stuck."); + self.steps.set(steps + 1); + } +} + pub struct ParserBuilder< 'src, 'toks, - SyntaxKind: EnumSetType + Into, + SyntaxKind: SyntaxElement, // SyntaxErr: SyntaxError, > { raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, @@ -32,9 +105,7 @@ pub struct ParserBuilder< step_limit: u32, } -impl<'src, 'toks, SyntaxKind: EnumSetType + Into> - ParserBuilder<'src, 'toks, SyntaxKind> -{ +impl<'src, 'toks, SyntaxKind: SyntaxElement> ParserBuilder<'src, 'toks, SyntaxKind> { pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { Self { raw_toks, diff --git a/crates/pawarser/src/parser/error.rs b/crates/pawarser/src/parser/error.rs index e27c536..ba52ff0 100644 --- a/crates/pawarser/src/parser/error.rs +++ b/crates/pawarser/src/parser/error.rs @@ -1,3 +1,7 @@ /// A marker trait... for now! // TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible -pub trait SyntaxError {} +pub trait SyntaxError +where + Self: Clone, +{ +} diff --git a/crates/pawarser/src/parser/event.rs b/crates/pawarser/src/parser/event.rs index cb1bed7..3cd0ef5 100644 --- a/crates/pawarser/src/parser/event.rs +++ b/crates/pawarser/src/parser/event.rs @@ -1,8 +1,8 @@ use enumset::EnumSetType; -use super::error::SyntaxError; +use super::{error::SyntaxError, SyntaxElement}; -pub enum Event, SyntaxErr: SyntaxError> { +pub enum Event { Start { kind: NodeKind, forward_parent: Option, @@ -13,9 +13,7 @@ pub enum Event, SyntaxErr: Syn }, } -impl, SyntaxErr: SyntaxError> - Event -{ +impl Event { pub fn tombstone() -> Self { Self::Start { kind: NodeKind::Tombstone, @@ -24,15 +22,14 @@ impl, SyntaxErr: SyntaxError> } } -pub enum NodeKind, SyntaxErr: SyntaxError> { +#[derive(Clone)] +pub enum NodeKind { Tombstone, Syntax(SyntaxKind), Error(SyntaxErr), } -impl, SyntaxErr: SyntaxError> - NodeKind -{ +impl NodeKind { pub fn is_tombstone(&self) -> bool { matches!(self, Self::Tombstone) } diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs index b148497..ec2a243 100644 --- a/crates/pawarser/src/parser/input.rs +++ b/crates/pawarser/src/parser/input.rs @@ -1,6 +1,8 @@ use enumset::{EnumSet, EnumSetType}; -pub struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> { +use super::SyntaxElement; + +pub struct Input<'src, 'toks, SyntaxKind: SyntaxElement> { raw: &'toks Vec<(SyntaxKind, &'src str)>, // enumset of meaningless tokens semantically_meaningless: EnumSet, @@ -8,9 +10,7 @@ pub struct Input<'src, 'toks, SyntaxKind: EnumSetType + Into> meaningful_toks: Vec, } -impl<'src, 'toks, SyntaxKind: EnumSetType + Into> - Input<'src, 'toks, SyntaxKind> -{ +impl<'src, 'toks, SyntaxKind: SyntaxElement> Input<'src, 'toks, SyntaxKind> { pub fn new( raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, meaningless: Option>, @@ -31,4 +31,28 @@ impl<'src, 'toks, SyntaxKind: EnumSetType + Into> meaningful_toks, } } + + pub fn kind(&self, idx: usize) -> SyntaxKind { + let Some(meaningful_idx) = self.meaningful_toks.get(idx) else { + return SyntaxKind::EOF; + }; + + self.raw.get(*meaningful_idx).unwrap().0 + } + + pub fn preceding_meaningless(&self, idx: usize) -> usize { + assert!(self.meaningful_toks.len() > idx); + + if idx == 0 { + // maybe should be `self.meaningful_toks[idx]` instead?? + 1 + } else { + self.meaningful_toks[idx] - self.meaningful_toks[idx - 1] + } + } + + /// get the count of meaningless tokens at the end of the file. + pub fn meaningless_tail_len(&self) -> usize { + self.raw.len() - (self.meaningful_toks.last().unwrap() + 1) + } } diff --git a/crates/pawarser/src/parser/marker.rs b/crates/pawarser/src/parser/marker.rs new file mode 100644 index 0000000..2d3fc5a --- /dev/null +++ b/crates/pawarser/src/parser/marker.rs @@ -0,0 +1,74 @@ +use drop_bomb::DropBomb; +use rowan::SyntaxKind; + +use super::{ + error::SyntaxError, + event::{Event, NodeKind}, + Parser, SyntaxElement, +}; + +pub struct Marker { + pos: usize, + bomb: DropBomb, +} + +impl Marker { + pub(super) fn new(pos: usize, name: &str) -> Self { + Self { + pos, + bomb: DropBomb::new(format!("Marker {name} must be completed or abandoned.")), + } + } + + fn close_node( + mut self, + p: &mut Parser, + kind: NodeKind, + ) -> CompletedMarker { + self.bomb.defuse(); + + match &mut p.events[self.pos] { + Event::Start { kind: slot, .. } => *slot = kind.clone(), + _ => unreachable!(), + } + + p.push_ev(Event::Finish); + CompletedMarker { + pos: self.pos, + kind, + } + } + + pub fn complete( + self, + p: &mut Parser, + kind: SyntaxKind, + ) -> CompletedMarker { + self.close_node(p, NodeKind::Syntax(kind)) + } + + pub fn error( + self, + p: &mut Parser, + kind: SyntaxErr, + ) -> CompletedMarker { + self.close_node(p, NodeKind::Error(kind)) + } + + pub fn abandon( + mut self, + p: &mut Parser, + ) { + } +} + +pub struct CompletedMarker { + pos: usize, + kind: NodeKind, +} + +impl CompletedMarker { + pub fn precede(self, p: &mut Parser, name: &str) -> Marker { + todo!() + } +} From becc4b4041aaf958da658c7635726a5b8ea1de1d Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Fri, 18 Oct 2024 14:05:27 +0200 Subject: [PATCH 169/189] json-pawarser: init --- Cargo.lock | 22 +++-- Cargo.toml | 4 +- crates/json-pawarser/Cargo.toml | 13 +++ crates/json-pawarser/src/grammar.rs | 67 +++++++++++++++ crates/json-pawarser/src/lib.rs | 3 + crates/json-pawarser/src/syntax_error.rs | 8 ++ crates/json-pawarser/src/syntax_kind.rs | 103 +++++++++++++++++++++++ crates/pawarser/src/lib.rs | 6 ++ crates/pawarser/src/parser.rs | 9 +- 9 files changed, 224 insertions(+), 11 deletions(-) create mode 100644 crates/json-pawarser/Cargo.toml create mode 100644 crates/json-pawarser/src/grammar.rs create mode 100644 crates/json-pawarser/src/lib.rs create mode 100644 crates/json-pawarser/src/syntax_error.rs create mode 100644 crates/json-pawarser/src/syntax_kind.rs diff --git a/Cargo.lock b/Cargo.lock index 4304154..a808278 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -804,6 +804,16 @@ dependencies = [ "rayon", ] +[[package]] +name = "json-pawarser" +version = "0.1.0" +dependencies = [ + "enumset", + "logos", + "pawarser", + "rowan", +] + [[package]] name = "lang" version = "0.1.0" @@ -881,18 +891,18 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "logos" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161971eb88a0da7ae0c333e1063467c5b5727e7fb6b710b8db4814eade3a42e8" +checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e31badd9de5131fdf4921f6473d457e3dd85b11b7f091ceb50e4df7c3eeb12a" +checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" dependencies = [ "beef", "fnv", @@ -905,9 +915,9 @@ dependencies = [ [[package]] name = "logos-derive" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2a69b3eb68d5bd595107c9ee58d7e07fe2bb5e360cc85b0f084dedac80de0a" +checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" dependencies = [ "logos-codegen", ] diff --git a/Cargo.toml b/Cargo.toml index e5c6dc7..794dd5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,9 @@ members = [ "crates/lang", "crates/svg-filters", "crates/prowocessing", - "crates/executor-poc", "crates/pawarser", + "crates/executor-poc", + "crates/pawarser", + "crates/json-pawarser", ] resolver = "2" diff --git a/crates/json-pawarser/Cargo.toml b/crates/json-pawarser/Cargo.toml new file mode 100644 index 0000000..eb342e9 --- /dev/null +++ b/crates/json-pawarser/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "json-pawarser" +version = "0.1.0" +edition = "2021" + +[dependencies] +logos = "0.14.2" +enumset = "1.1.3" +rowan = "0.15.15" +pawarser = { path = "../pawarser" } + +[lints] +workspace = true diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs new file mode 100644 index 0000000..3ececd8 --- /dev/null +++ b/crates/json-pawarser/src/grammar.rs @@ -0,0 +1,67 @@ +use enumset::{enum_set, EnumSet}; + +use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + +use self::object::object; + +type Parser<'src, 'toks> = pawarser::Parser<'src, 'toks, SyntaxKind, SyntaxError>; +type CompletedMarker = pawarser::CompletedMarker; + +const BASIC_VALUE_TOKENS: EnumSet = + enum_set!(SyntaxKind::BOOL | SyntaxKind::NULL | SyntaxKind::NUMBER | SyntaxKind::STRING); + +pub fn value(p: &mut Parser) -> bool { + if BASIC_VALUE_TOKENS.contains(p.current()) { + p.do_bump(); + return true; + } else { + object(p).is_some() + } +} + +mod object { + use crate::{grammar::value, syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + + use super::{CompletedMarker, Parser, BASIC_VALUE_TOKENS}; + + pub(super) fn object(p: &mut Parser) -> Option { + let obj_start = p.start("object"); + + if !p.at(SyntaxKind::BRACE_OPEN) { + obj_start.abandon(p); + return None; + } + + todo!() + } + + fn member(p: &mut Parser) -> Option { + let member_start = p.start("member"); + + if p.at(SyntaxKind::BRACE_CLOSE) { + member_start.abandon(p); + return None; + } else if p.at(SyntaxKind::STRING) { + let member_name_start = p.start("member_name"); + p.eat(SyntaxKind::STRING); + member_name_start.complete(p, SyntaxKind::MEMBER_NAME); + } else { + return todo!("handle other tokens"); + } + + if !p.eat(SyntaxKind::COLON) { + todo!("handle wrong tokens") + } + + if value(p) { + Some(member_start.complete(p, SyntaxKind::MEMBER)) + } else { + let e = member_start.error(p, SyntaxError::MemberMissingValue); + Some( + e.precede(p, "member but failed already") + .complete(p, SyntaxKind::MEMBER), + ) + } + } +} +mod array {} diff --git a/crates/json-pawarser/src/lib.rs b/crates/json-pawarser/src/lib.rs new file mode 100644 index 0000000..89160be --- /dev/null +++ b/crates/json-pawarser/src/lib.rs @@ -0,0 +1,3 @@ +mod grammar; +mod syntax_error; +mod syntax_kind; diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs new file mode 100644 index 0000000..6ff9067 --- /dev/null +++ b/crates/json-pawarser/src/syntax_error.rs @@ -0,0 +1,8 @@ +use crate::syntax_kind::SyntaxKind; + +#[derive(Clone)] +pub enum SyntaxError { + DisallowedKeyType(SyntaxKind), + MemberMissingValue, +} +impl pawarser::parser::SyntaxError for SyntaxError {} diff --git a/crates/json-pawarser/src/syntax_kind.rs b/crates/json-pawarser/src/syntax_kind.rs new file mode 100644 index 0000000..9d3dc2c --- /dev/null +++ b/crates/json-pawarser/src/syntax_kind.rs @@ -0,0 +1,103 @@ +use logos::Logos; + +pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { + let mut lex = SyntaxKind::lexer(src); + let mut r = Vec::new(); + + while let Some(tok_res) = lex.next() { + r.push((tok_res.unwrap_or(SyntaxKind::LEX_ERR), lex.slice())) + } + + r +} + +#[derive(enumset::EnumSetType, Debug, Logos, PartialEq, Eq, Clone, Copy, Hash)] +#[repr(u16)] +#[enumset(no_super_impls)] +#[allow(non_camel_case_types)] +pub enum SyntaxKind { + // Error SyntaxKinds + LEX_ERR, + PARSE_ERR, + + // Meta SyntaxKinds + TOMBSTONE, + EOF, + + OBJECT, + MEMBER, + MEMBER_NAME, + MEMBER_VALUE, + + ARRAY, + ELEMENT, + + // Tokens + // Regexes adapted from [the logos handbook](https://logos.maciej.codes/examples/json_borrowed.html) + #[token("true")] + #[token("false")] + BOOL, + #[token("{")] + BRACE_OPEN, + #[token("}")] + BRACE_CLOSE, + #[token("[")] + BRACKET_OPEN, + #[token("]")] + BRACKET_CLOSE, + #[token(":")] + COLON, + #[token(",")] + COMMA, + #[token("null")] + NULL, + #[regex(r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?")] + NUMBER, + #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)] + STRING, + + // Whitespace tokens + #[regex("[ \\t\\f]+")] + WHITESPACE, + #[token("\n")] + NEWLINE, +} + +impl pawarser::parser::SyntaxElement for SyntaxKind { + const EOF: Self = Self::EOF; + + const ERROR: Self = Self::PARSE_ERR; +} + +impl From for rowan::SyntaxKind { + fn from(kind: SyntaxKind) -> Self { + Self(kind as u16) + } +} + +#[cfg(test)] +mod tests { + use crate::syntax_kind::{lex, SyntaxKind}; + + #[test] + fn simple_object() { + const TEST_DATA: &str = r#"{"hello_world": "meow", "some_num":7.42}"#; + + assert_eq!( + dbg!(lex(TEST_DATA)), + vec![ + (SyntaxKind::BRACE_OPEN, "{"), + (SyntaxKind::STRING, "\"hello_world\""), + (SyntaxKind::COLON, ":"), + (SyntaxKind::WHITESPACE, " "), + (SyntaxKind::STRING, "\"meow\""), + (SyntaxKind::COMMA, ","), + (SyntaxKind::WHITESPACE, " "), + (SyntaxKind::STRING, "\"some_num\""), + (SyntaxKind::COLON, ":"), + (SyntaxKind::NUMBER, "7.42"), + (SyntaxKind::BRACE_CLOSE, "}") + ] + ); + } +} diff --git a/crates/pawarser/src/lib.rs b/crates/pawarser/src/lib.rs index 92dcd54..26d8679 100644 --- a/crates/pawarser/src/lib.rs +++ b/crates/pawarser/src/lib.rs @@ -1,2 +1,8 @@ #![feature(iter_collect_into)] pub mod parser; + +pub use parser::{ + error::SyntaxError, + marker::{CompletedMarker, Marker}, + Parser, SyntaxElement, +}; diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 0bac65a..09b1bf4 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -2,12 +2,13 @@ use std::cell::Cell; use enumset::{EnumSet, EnumSetType}; -use self::{error::SyntaxError, event::Event, input::Input, marker::Marker}; +use self::{event::Event, input::Input, marker::Marker}; +pub use error::SyntaxError; -mod error; +pub mod error; mod event; mod input; -mod marker; +pub mod marker; /// this is used to define some required SyntaxKinds like an EOF token or an error token pub trait SyntaxElement @@ -61,7 +62,7 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> true } - fn do_bump(&mut self) { + pub fn do_bump(&mut self) { self.push_ev(Event::Eat { count: self.input.preceding_meaningless(self.pos), }); From 91f766c18ebd4da33cabf567256910717cf9574f Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 15:11:08 +0200 Subject: [PATCH 170/189] pawarser: make raw_tokens vec owned in input --- crates/json-pawarser/src/grammar.rs | 2 +- crates/pawarser/src/parser.rs | 15 +++++++-------- crates/pawarser/src/parser/input.rs | 8 ++++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index 3ececd8..2f1745c 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -4,7 +4,7 @@ use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; use self::object::object; -type Parser<'src, 'toks> = pawarser::Parser<'src, 'toks, SyntaxKind, SyntaxError>; +type Parser<'src> = pawarser::Parser<'src, SyntaxKind, SyntaxError>; type CompletedMarker = pawarser::CompletedMarker; const BASIC_VALUE_TOKENS: EnumSet = diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 09b1bf4..91d44b8 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -21,8 +21,8 @@ where const ERROR: Self; } -pub struct Parser<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> { - input: Input<'src, 'toks, SyntaxKind>, +pub struct Parser<'src, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> { + input: Input<'src, SyntaxKind>, pos: usize, events: Vec>, step_limit: u32, @@ -30,7 +30,7 @@ pub struct Parser<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError } impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> - Parser<'src, 'toks, SyntaxKind, SyntaxErr> + Parser<'src, SyntaxKind, SyntaxErr> { /// eat all meaningless tokens at the end of the file. pub fn eat_succeeding_meaningless(&mut self) { @@ -97,17 +97,16 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> pub struct ParserBuilder< 'src, - 'toks, SyntaxKind: SyntaxElement, // SyntaxErr: SyntaxError, > { - raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + raw_toks: Vec<(SyntaxKind, &'src str)>, meaningless_token_kinds: EnumSet, step_limit: u32, } -impl<'src, 'toks, SyntaxKind: SyntaxElement> ParserBuilder<'src, 'toks, SyntaxKind> { - pub fn new(raw_toks: &'toks Vec<(SyntaxKind, &'src str)>) -> Self { +impl<'src, SyntaxKind: SyntaxElement> ParserBuilder<'src, SyntaxKind> { + pub fn new(raw_toks: Vec<(SyntaxKind, &'src str)>) -> Self { Self { raw_toks, meaningless_token_kinds: EnumSet::new(), @@ -133,7 +132,7 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement> ParserBuilder<'src, 'toks, SyntaxKi self } - pub fn build(self) -> Parser<'src, 'toks, SyntaxKind, SyntaxErr> { + pub fn build(self) -> Parser<'src, SyntaxKind, SyntaxErr> { let Self { raw_toks, meaningless_token_kinds, diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs index ec2a243..0a5ff60 100644 --- a/crates/pawarser/src/parser/input.rs +++ b/crates/pawarser/src/parser/input.rs @@ -2,17 +2,17 @@ use enumset::{EnumSet, EnumSetType}; use super::SyntaxElement; -pub struct Input<'src, 'toks, SyntaxKind: SyntaxElement> { - raw: &'toks Vec<(SyntaxKind, &'src str)>, +pub struct Input<'src, SyntaxKind: SyntaxElement> { + raw: Vec<(SyntaxKind, &'src str)>, // enumset of meaningless tokens semantically_meaningless: EnumSet, // indices of non-meaningless tokens meaningful_toks: Vec, } -impl<'src, 'toks, SyntaxKind: SyntaxElement> Input<'src, 'toks, SyntaxKind> { +impl<'src, SyntaxKind: SyntaxElement> Input<'src, SyntaxKind> { pub fn new( - raw_toks: &'toks Vec<(SyntaxKind, &'src str)>, + raw_toks: Vec<(SyntaxKind, &'src str)>, meaningless: Option>, ) -> Self { let mut meaningful_toks = Vec::new(); From fed8cf2466c651ed5114e3a81a15b4b7b8930806 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 15:15:06 +0200 Subject: [PATCH 171/189] pawarser: require/derive `PartialEq` + `Eq` for NodeKind and its contents --- crates/json-pawarser/src/syntax_error.rs | 2 +- crates/pawarser/src/parser.rs | 2 +- crates/pawarser/src/parser/error.rs | 2 +- crates/pawarser/src/parser/event.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs index 6ff9067..84377d7 100644 --- a/crates/json-pawarser/src/syntax_error.rs +++ b/crates/json-pawarser/src/syntax_error.rs @@ -1,6 +1,6 @@ use crate::syntax_kind::SyntaxKind; -#[derive(Clone)] +#[derive(Clone, PartialEq, Eq)] pub enum SyntaxError { DisallowedKeyType(SyntaxKind), MemberMissingValue, diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 91d44b8..bc4724f 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -13,7 +13,7 @@ pub mod marker; /// this is used to define some required SyntaxKinds like an EOF token or an error token pub trait SyntaxElement where - Self: EnumSetType + Into + Clone, + Self: EnumSetType + Into + Clone + PartialEq + Eq, { /// EOF value. This will be used by the rest of the parser library to represent an EOF. const EOF: Self; diff --git a/crates/pawarser/src/parser/error.rs b/crates/pawarser/src/parser/error.rs index ba52ff0..07c033d 100644 --- a/crates/pawarser/src/parser/error.rs +++ b/crates/pawarser/src/parser/error.rs @@ -2,6 +2,6 @@ // TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible pub trait SyntaxError where - Self: Clone, + Self: Clone + PartialEq + Eq, { } diff --git a/crates/pawarser/src/parser/event.rs b/crates/pawarser/src/parser/event.rs index 3cd0ef5..1b71d8e 100644 --- a/crates/pawarser/src/parser/event.rs +++ b/crates/pawarser/src/parser/event.rs @@ -22,7 +22,7 @@ impl Event { Tombstone, Syntax(SyntaxKind), From 9b1f6a1dc11b55b161e8d6c2d7cd32d393d28815 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 15:15:40 +0200 Subject: [PATCH 172/189] pawarser: Implement `CompletedMarker::precede` --- crates/pawarser/src/parser/marker.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/pawarser/src/parser/marker.rs b/crates/pawarser/src/parser/marker.rs index 2d3fc5a..d03e358 100644 --- a/crates/pawarser/src/parser/marker.rs +++ b/crates/pawarser/src/parser/marker.rs @@ -69,6 +69,17 @@ pub struct CompletedMarker { impl CompletedMarker { pub fn precede(self, p: &mut Parser, name: &str) -> Marker { - todo!() + let new_pos = p.start(name); + + match &mut p.events[self.pos] { + Event::Start { forward_parent, .. } => { + // point forward parent of the node this marker completed to the new node + // will later be used to make the new node a parent of the current node. + *forward_parent = Some(new_pos.pos - self.pos) + } + _ => unreachable!(), + } + + new_pos } } From ac75978c01b22264889d06f7e54633055dc2ff36 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 15:16:36 +0200 Subject: [PATCH 173/189] pawarser: Implement `Parser::finish` --- crates/pawarser/src/parser.rs | 89 ++++++++++++++++++++++++++++- crates/pawarser/src/parser/input.rs | 9 +++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index bc4724f..ccbb5b2 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -1,6 +1,9 @@ -use std::cell::Cell; +use std::{cell::Cell, marker::PhantomData, mem}; use enumset::{EnumSet, EnumSetType}; +use rowan::{GreenNode, GreenNodeBuilder}; + +use crate::parser::event::NodeKind; use self::{event::Event, input::Input, marker::Marker}; pub use error::SyntaxError; @@ -93,6 +96,90 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> assert!(steps <= self.step_limit, "the parser seems stuck."); self.steps.set(steps + 1); } + + pub fn finish( + Self { + input, + pos, + mut events, + step_limit, + steps, + }: Self, + ) -> ParserOutput { + let (mut raw_toks, meaningless_tokens) = input.dissolve(); + let mut builder = GreenNodeBuilder::new(); + // TODO: document what the hell a forward parent is + let mut fw_parents = Vec::new(); + let mut errors: Vec = Vec::new(); + raw_toks.reverse(); + + for i in 0..events.len() { + match mem::replace(&mut events[i], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + if kind == NodeKind::Tombstone && forward_parent.is_none() { + continue; + } + + // resolving forward parents + // temporarily jump around with the parser index and replace them with tombstones + fw_parents.push(kind); + let mut idx = i; + let mut fp = forward_parent; + while let Some(fwd) = fp { + idx += fwd as usize; + fp = match mem::replace(&mut events[idx], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + fw_parents.push(kind); + forward_parent + } + _ => unreachable!(), + } + } + + // clear semantically meaningless tokens before the new tree node for aesthetic reasons + while raw_toks + .last() + .is_some_and(|v| meaningless_tokens.contains(v.0)) + { + // update first next Eat event + match events.iter_mut().find(|ev| matches!(ev, Event::Eat { .. })) { + Some(Event::Eat { count }) => *count -= 1, + _ => unreachable!(), + } + + // put whitespace into lst + let (tok, text) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + } + + // insert forward parents into the tree in correct order + for kind in fw_parents.drain(..).rev() { + match kind { + NodeKind::Syntax(kind) => builder.start_node(kind.into()), + NodeKind::Error(err) => { + errors.push(err); + builder.start_node(SyntaxKind::ERROR.into()) + } + _ => {} + } + } + } + Event::Finish => builder.finish_node(), + Event::Eat { count } => (0..count).for_each(|_| { + let (tok, text) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + }), + } + } + + todo!() + } } pub struct ParserBuilder< diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs index 0a5ff60..a20d73d 100644 --- a/crates/pawarser/src/parser/input.rs +++ b/crates/pawarser/src/parser/input.rs @@ -55,4 +55,13 @@ impl<'src, SyntaxKind: SyntaxElement> Input<'src, SyntaxKind> { pub fn meaningless_tail_len(&self) -> usize { self.raw.len() - (self.meaningful_toks.last().unwrap() + 1) } + + pub fn dissolve(self) -> (Vec<(SyntaxKind, &'src str)>, EnumSet) { + let Self { + raw, + semantically_meaningless, + .. + } = self; + (raw, semantically_meaningless) + } } From af6886214bee8554d72e87bba06114d8f0a27526 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 15:31:08 +0200 Subject: [PATCH 174/189] flake.lock: Update --- flake.lock | 458 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 268 insertions(+), 190 deletions(-) diff --git a/flake.lock b/flake.lock index 9719001..0d61b34 100644 --- a/flake.lock +++ b/flake.lock @@ -3,12 +3,54 @@ "cachix": { "inputs": { "devenv": "devenv_2", - "flake-compat": "flake-compat_2", + "flake-compat": [ + "devenv", + "flake-compat" + ], + "git-hooks": [ + "devenv", + "pre-commit-hooks" + ], "nixpkgs": [ "devenv", "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726520618, + "narHash": "sha256-jOsaBmJ/EtX5t/vbylCdS7pWYcKGmWOKg4QKUzKr6dA=", + "owner": "cachix", + "repo": "cachix", + "rev": "695525f9086542dfb09fde0871dbf4174abbf634", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, + "cachix_2": { + "inputs": { + "devenv": "devenv_3", + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "flake-compat" ], - "pre-commit-hooks": "pre-commit-hooks" + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ], + "pre-commit-hooks": [ + "devenv", + "cachix", + "devenv", + "pre-commit-hooks" + ] }, "locked": { "lastModified": 1712055811, @@ -27,17 +69,17 @@ "devenv": { "inputs": { "cachix": "cachix", - "flake-compat": "flake-compat_4", - "nix": "nix_2", - "nixpkgs": "nixpkgs_2", + "flake-compat": "flake-compat_2", + "nix": "nix_3", + "nixpkgs": "nixpkgs_3", "pre-commit-hooks": "pre-commit-hooks_2" }, "locked": { - "lastModified": 1712925466, - "narHash": "sha256-MJ6VxGNu/ftbn8SErJjBz80FUNXkZfcObHg/JP7wwAc=", + "lastModified": 1729445229, + "narHash": "sha256-3vhSEs2ufSvv2Oct8G9CWEPFI57c4NAZ2wR2accHELM=", "owner": "cachix", "repo": "devenv", - "rev": "1af93652caf48bfeef6ba7d1cf59fc66e506e5c2", + "rev": "006016cf4191c34c17cfdb6669e0690e24302ac0", "type": "github" }, "original": { @@ -48,15 +90,53 @@ }, "devenv_2": { "inputs": { + "cachix": "cachix_2", "flake-compat": [ "devenv", "cachix", "flake-compat" ], + "nix": "nix_2", + "nixpkgs": [ + "devenv", + "cachix", + "nixpkgs" + ], + "pre-commit-hooks": [ + "devenv", + "cachix", + "git-hooks" + ] + }, + "locked": { + "lastModified": 1723156315, + "narHash": "sha256-0JrfahRMJ37Rf1i0iOOn+8Z4CLvbcGNwa2ChOAVrp/8=", + "owner": "cachix", + "repo": "devenv", + "rev": "ff5eb4f2accbcda963af67f1a1159e3f6c7f5f91", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "devenv_3": { + "inputs": { + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "cachix", + "flake-compat" + ], "nix": "nix", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix", "pre-commit-hooks": [ + "devenv", + "cachix", "devenv", "cachix", "pre-commit-hooks" @@ -79,15 +159,15 @@ }, "fenix": { "inputs": { - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_4", "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1712903033, - "narHash": "sha256-KcvsEm0h1mIwBHFAzWFBjGihnbf2fxpAaXOdVbUfAI4=", + "lastModified": 1729492502, + "narHash": "sha256-d6L4bBlUWr4sHC+eRXo+4acFPEFXKmqHpM/BfQ5gQQw=", "owner": "nix-community", "repo": "fenix", - "rev": "c739f83545e625227f4d0af7fe2a71e69931fa4c", + "rev": "4002a1ec3486b855f341d2b864ba06b61e73af28", "type": "github" }, "original": { @@ -128,51 +208,25 @@ "type": "github" } }, - "flake-compat_3": { - "flake": false, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "devenv", + "nix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "lastModified": 1712014858, + "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_4": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_5": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "hercules-ci", + "repo": "flake-parts", "type": "github" } }, @@ -195,33 +249,12 @@ } }, "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -231,29 +264,6 @@ } }, "gitignore": { - "inputs": { - "nixpkgs": [ - "devenv", - "cachix", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1703887061, - "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore_2": { "inputs": { "nixpkgs": [ "devenv", @@ -275,10 +285,28 @@ "type": "github" } }, + "libgit2": { + "flake": false, + "locked": { + "lastModified": 1697646580, + "narHash": "sha256-oX4Z3S9WtJlwvj0uH9HlYcWv+x1hqp8mhXl7HsLu2f0=", + "owner": "libgit2", + "repo": "libgit2", + "rev": "45fd9ed7ae1a9b74b957ef4f337bc3c8b3df01b5", + "type": "github" + }, + "original": { + "owner": "libgit2", + "repo": "libgit2", + "type": "github" + } + }, "nix": { "inputs": { "flake-compat": "flake-compat", "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -287,11 +315,11 @@ "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1708577783, - "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", "owner": "domenkozar", "repo": "nix", - "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", "type": "github" }, "original": { @@ -304,6 +332,8 @@ "nix-github-actions": { "inputs": { "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -327,8 +357,15 @@ }, "nix_2": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "flake-compat" + ], "nixpkgs": [ + "devenv", + "cachix", "devenv", "nixpkgs" ], @@ -349,6 +386,34 @@ "type": "github" } }, + "nix_3": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-parts": "flake-parts", + "libgit2": "libgit2", + "nixpkgs": "nixpkgs_2", + "nixpkgs-23-11": "nixpkgs-23-11", + "nixpkgs-regression": "nixpkgs-regression_3", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1727438425, + "narHash": "sha256-X8ES7I1cfNhR9oKp06F6ir4Np70WGZU5sfCOuNBEwMg=", + "owner": "domenkozar", + "repo": "nix", + "rev": "f6c5ae4c1b2e411e6b1e6a8181cc84363d6a7546", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.24", + "repo": "nix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1692808169, @@ -365,6 +430,22 @@ "type": "github" } }, + "nixpkgs-23-11": { + "locked": { + "lastModified": 1717159533, + "narHash": "sha256-oamiKNfr2MS6yH64rUn99mIZjc45nGJlj9eGth/3Xuw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446", + "type": "github" + } + }, "nixpkgs-regression": { "locked": { "lastModified": 1643052045, @@ -397,45 +478,61 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-regression_3": { "locked": { - "lastModified": 1704874635, - "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" } }, - "nixpkgs-stable_2": { + "nixpkgs-stable": { "locked": { - "lastModified": 1710695816, - "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1710796454, - "narHash": "sha256-lQlICw60RhH8sHTDD/tJiiJrlAfNn8FDI9c+7G2F0SE=", + "lastModified": 1717432640, + "narHash": "sha256-+f9c4/ZX5MWDOuB1rKoWj+lBNm0z0rs4CK47HBLxy1o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "88269ab3044128b7c2f4c7d68448b2fb50456870", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1716977621, + "narHash": "sha256-Q1UQzYcMJH4RscmpTkjlgqQDX5yi1tZL0O345Ri6vXQ=", "owner": "cachix", "repo": "devenv-nixpkgs", - "rev": "06fb0f1c643aee3ae6838dda3b37ef0abc3c763b", + "rev": "4267e705586473d3e5c8d50299e71503f16a6fb6", "type": "github" }, "original": { @@ -445,13 +542,13 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { @@ -461,13 +558,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_5": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { @@ -482,6 +579,8 @@ "flake-utils": "flake-utils", "nix-github-actions": "nix-github-actions", "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -503,44 +602,26 @@ } }, "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_3", - "flake-utils": "flake-utils_2", - "gitignore": "gitignore", - "nixpkgs": [ - "devenv", - "cachix", - "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1708018599, - "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks_2": { "inputs": { "flake-compat": [ "devenv", - "flake-compat" + "nix" + ], + "flake-utils": "flake-utils_2", + "gitignore": [ + "devenv", + "nix" ], - "flake-utils": "flake-utils_3", - "gitignore": "gitignore_2", "nixpkgs": [ "devenv", + "nix", "nixpkgs" ], - "nixpkgs-stable": "nixpkgs-stable_2" + "nixpkgs-stable": [ + "devenv", + "nix", + "nixpkgs" + ] }, "locked": { "lastModified": 1712897695, @@ -556,22 +637,49 @@ "type": "github" } }, + "pre-commit-hooks_2": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1726745158, + "narHash": "sha256-D5AegvGoEjt4rkKedmxlSEmC+nNLMBPWFxvmYnVLhjk=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "4e743a6920eab45e8ba0fbe49dc459f1423a4b74", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "devenv": "devenv", "fenix": "fenix", - "nixpkgs": "nixpkgs_4", - "systems": "systems_4" + "nixpkgs": "nixpkgs_5", + "systems": "systems_2" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1712818880, - "narHash": "sha256-VDxsvgj/bNypHq48tQWtc3VRbWvzlFjzKf9ZZIVO10Y=", + "lastModified": 1729454508, + "narHash": "sha256-1W5B/CnLgdC03iIFG0wtawO1+dGDWDpc84PeOHo2ecU=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "657b33b0cb9bd49085202e91ad5b4676532c9140", + "rev": "9323b5385863739d1c113f02e4cf3f2777c09977", "type": "github" }, "original": { @@ -610,36 +718,6 @@ "repo": "default", "type": "github" } - }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", From b8720b2df99e9019691a8e0e08d2dddf28c561e8 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Mon, 21 Oct 2024 18:29:46 +0200 Subject: [PATCH 175/189] pawarser, json-pawarser: get first debug print working! --- crates/json-pawarser/src/grammar.rs | 13 +++-- crates/json-pawarser/src/lib.rs | 26 +++++++++ crates/json-pawarser/src/syntax_error.rs | 2 +- crates/json-pawarser/src/syntax_kind.rs | 25 ++++++--- crates/pawarser/src/parser.rs | 26 ++++++--- crates/pawarser/src/parser/error.rs | 4 +- crates/pawarser/src/parser/output.rs | 67 ++++++++++++++++++++++++ 7 files changed, 140 insertions(+), 23 deletions(-) create mode 100644 crates/pawarser/src/parser/output.rs diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index 2f1745c..466f22c 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -4,8 +4,8 @@ use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; use self::object::object; -type Parser<'src> = pawarser::Parser<'src, SyntaxKind, SyntaxError>; -type CompletedMarker = pawarser::CompletedMarker; +pub(crate) type Parser<'src> = pawarser::Parser<'src, SyntaxKind, SyntaxError>; +pub(crate) type CompletedMarker = pawarser::CompletedMarker; const BASIC_VALUE_TOKENS: EnumSet = enum_set!(SyntaxKind::BOOL | SyntaxKind::NULL | SyntaxKind::NUMBER | SyntaxKind::STRING); @@ -27,12 +27,15 @@ mod object { pub(super) fn object(p: &mut Parser) -> Option { let obj_start = p.start("object"); - if !p.at(SyntaxKind::BRACE_OPEN) { + if !p.eat(SyntaxKind::BRACE_OPEN) { obj_start.abandon(p); return None; } - todo!() + member(p); + + p.eat(SyntaxKind::BRACE_CLOSE); + Some(obj_start.complete(p, SyntaxKind::OBJECT)) } fn member(p: &mut Parser) -> Option { @@ -46,7 +49,7 @@ mod object { p.eat(SyntaxKind::STRING); member_name_start.complete(p, SyntaxKind::MEMBER_NAME); } else { - return todo!("handle other tokens"); + return todo!("handle other tokens: {:?}", p.current()); } if !p.eat(SyntaxKind::COLON) { diff --git a/crates/json-pawarser/src/lib.rs b/crates/json-pawarser/src/lib.rs index 89160be..05c529e 100644 --- a/crates/json-pawarser/src/lib.rs +++ b/crates/json-pawarser/src/lib.rs @@ -1,3 +1,29 @@ mod grammar; mod syntax_error; mod syntax_kind; + +#[cfg(test)] +mod test { + use pawarser::parser::ParserBuilder; + + use crate::{ + grammar::{value, Parser}, + syntax_kind::{lex, SyntaxKind}, + }; + + #[test] + fn test() { + const TEST_DATA: &str = r#"{"hello_world": "meow"}"#; + let toks = lex(TEST_DATA); + + let mut p: Parser = ParserBuilder::new(toks) + .add_meaningless(SyntaxKind::WHITESPACE) + .add_meaningless(SyntaxKind::NEWLINE) + .build(); + + value(&mut p); + + let out = p.finish(); + assert_eq!("", format!("{:#?}", out)) + } +} diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs index 84377d7..45bb5bd 100644 --- a/crates/json-pawarser/src/syntax_error.rs +++ b/crates/json-pawarser/src/syntax_error.rs @@ -1,6 +1,6 @@ use crate::syntax_kind::SyntaxKind; -#[derive(Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub enum SyntaxError { DisallowedKeyType(SyntaxKind), MemberMissingValue, diff --git a/crates/json-pawarser/src/syntax_kind.rs b/crates/json-pawarser/src/syntax_kind.rs index 9d3dc2c..dfaab13 100644 --- a/crates/json-pawarser/src/syntax_kind.rs +++ b/crates/json-pawarser/src/syntax_kind.rs @@ -16,14 +16,6 @@ pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { #[enumset(no_super_impls)] #[allow(non_camel_case_types)] pub enum SyntaxKind { - // Error SyntaxKinds - LEX_ERR, - PARSE_ERR, - - // Meta SyntaxKinds - TOMBSTONE, - EOF, - OBJECT, MEMBER, MEMBER_NAME, @@ -61,6 +53,13 @@ pub enum SyntaxKind { WHITESPACE, #[token("\n")] NEWLINE, + + // Error SyntaxKinds + LEX_ERR, + PARSE_ERR, + + // Meta SyntaxKinds + EOF, } impl pawarser::parser::SyntaxElement for SyntaxKind { @@ -75,6 +74,16 @@ impl From for rowan::SyntaxKind { } } +impl From for SyntaxKind { + fn from(raw: rowan::SyntaxKind) -> Self { + assert!(raw.0 <= SyntaxKind::EOF as u16); + #[allow(unsafe_code, reason = "The transmute is necessary here")] + unsafe { + std::mem::transmute::(raw.0) + } + } +} + #[cfg(test)] mod tests { use crate::syntax_kind::{lex, SyntaxKind}; diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index ccbb5b2..2a666bf 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -1,4 +1,4 @@ -use std::{cell::Cell, marker::PhantomData, mem}; +use std::{cell::Cell, fmt, marker::PhantomData, mem}; use enumset::{EnumSet, EnumSetType}; use rowan::{GreenNode, GreenNodeBuilder}; @@ -6,17 +6,24 @@ use rowan::{GreenNode, GreenNodeBuilder}; use crate::parser::event::NodeKind; use self::{event::Event, input::Input, marker::Marker}; -pub use error::SyntaxError; +pub use {error::SyntaxError, output::ParserOutput}; pub mod error; mod event; mod input; pub mod marker; +pub mod output; /// this is used to define some required SyntaxKinds like an EOF token or an error token pub trait SyntaxElement where - Self: EnumSetType + Into + Clone + PartialEq + Eq, + Self: EnumSetType + + Into + + From + + fmt::Debug + + Clone + + PartialEq + + Eq, { /// EOF value. This will be used by the rest of the parser library to represent an EOF. const EOF: Self; @@ -97,15 +104,14 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> self.steps.set(steps + 1); } - pub fn finish( - Self { + pub fn finish(self) -> ParserOutput { + let Self { input, pos, mut events, step_limit, steps, - }: Self, - ) -> ParserOutput { + } = self; let (mut raw_toks, meaningless_tokens) = input.dissolve(); let mut builder = GreenNodeBuilder::new(); // TODO: document what the hell a forward parent is @@ -178,7 +184,11 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> } } - todo!() + ParserOutput { + green_node: builder.finish(), + errors, + _syntax_kind: PhantomData::, + } } } diff --git a/crates/pawarser/src/parser/error.rs b/crates/pawarser/src/parser/error.rs index 07c033d..9c9d893 100644 --- a/crates/pawarser/src/parser/error.rs +++ b/crates/pawarser/src/parser/error.rs @@ -1,7 +1,9 @@ +use std::fmt; + /// A marker trait... for now! // TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible pub trait SyntaxError where - Self: Clone + PartialEq + Eq, + Self: fmt::Debug + Clone + PartialEq + Eq, { } diff --git a/crates/pawarser/src/parser/output.rs b/crates/pawarser/src/parser/output.rs new file mode 100644 index 0000000..bea13e8 --- /dev/null +++ b/crates/pawarser/src/parser/output.rs @@ -0,0 +1,67 @@ +use std::{fmt, marker::PhantomData}; + +use rowan::{GreenNode, GreenNodeData, GreenTokenData, NodeOrToken}; + +use crate::{SyntaxElement, SyntaxError}; + +pub struct ParserOutput { + pub green_node: GreenNode, + pub errors: Vec, + pub(super) _syntax_kind: PhantomData, +} + +impl std::fmt::Debug + for ParserOutput +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut errs: Vec<&SyntaxErr> = self.errors.iter().collect(); + errs.reverse(); + debug_print_output::( + NodeOrToken::Node(&self.green_node), + f, + 0, + &mut errs, + ) + } +} + +fn debug_print_output( + node: NodeOrToken<&GreenNodeData, &GreenTokenData>, + f: &mut std::fmt::Formatter<'_>, + lvl: i32, + errs: &mut Vec<&SyntaxErr>, +) -> std::fmt::Result { + for _ in 0..lvl { + f.write_str(" ")?; + } + + match node { + NodeOrToken::Node(n) => { + let kind: SyntaxKind = node.kind().into(); + if kind != SyntaxKind::ERROR { + writeln!(f, "{:?} {{", kind)?; + } else { + let err = errs + .pop() + .expect("all error syntax nodes should correspond to an error"); + + writeln!(f, "{:?}: {err:?} {{", kind)?; + } + for c in n.children() { + debug_print_output::(c, f, lvl + 1, errs)?; + } + for _ in 0..lvl { + f.write_str(" ")?; + } + f.write_str("}\n") + } + NodeOrToken::Token(t) => { + writeln!( + f, + "{:?} {:?};", + Into::::into(t.kind()), + t.text() + ) + } + } +} From c564d0f24c660134831a46705f6e1caf04fc4a24 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 23 Oct 2024 10:51:43 +0200 Subject: [PATCH 176/189] implement `Marker::abandon` --- crates/pawarser/src/parser/marker.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/pawarser/src/parser/marker.rs b/crates/pawarser/src/parser/marker.rs index d03e358..2e1244d 100644 --- a/crates/pawarser/src/parser/marker.rs +++ b/crates/pawarser/src/parser/marker.rs @@ -59,6 +59,18 @@ impl Marker { mut self, p: &mut Parser, ) { + self.bomb.defuse(); + + // clean up empty tombstone event from marker + if self.pos == p.events.len() - 1 { + match p.events.pop() { + Some(Event::Start { + kind: NodeKind::Tombstone, + forward_parent: None, + }) => (), + _ => unreachable!(), + } + } } } From 316432856808c238a57508810d05d4fec5231821 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 23 Oct 2024 10:52:44 +0200 Subject: [PATCH 177/189] implement multiple members, member_values and trailing commata --- crates/json-pawarser/src/grammar.rs | 21 +++++++++++++++++-- crates/json-pawarser/src/lib.rs | 26 ------------------------ crates/json-pawarser/src/syntax_error.rs | 2 ++ crates/json-pawarser/src/syntax_kind.rs | 3 +++ 4 files changed, 24 insertions(+), 28 deletions(-) diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index 466f22c..b7afe02 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -33,9 +33,23 @@ mod object { } member(p); + while p.at(SyntaxKind::COMMA) { + // not always an error, later configurable + let potential_unexpected_comma = p.start("potential_unexpected_comma"); + p.eat(SyntaxKind::COMMA); - p.eat(SyntaxKind::BRACE_CLOSE); - Some(obj_start.complete(p, SyntaxKind::OBJECT)) + if member(p).is_none() { + potential_unexpected_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + potential_unexpected_comma.abandon(p); + } + } + + Some(if !p.eat(SyntaxKind::BRACE_CLOSE) { + obj_start.error(p, SyntaxError::UnclosedObject) + } else { + obj_start.complete(p, SyntaxKind::OBJECT) + }) } fn member(p: &mut Parser) -> Option { @@ -56,9 +70,12 @@ mod object { todo!("handle wrong tokens") } + let member_value_start = p.start("member_value_start"); if value(p) { + member_value_start.complete(p, SyntaxKind::MEMBER_VALUE); Some(member_start.complete(p, SyntaxKind::MEMBER)) } else { + member_value_start.abandon(p); let e = member_start.error(p, SyntaxError::MemberMissingValue); Some( e.precede(p, "member but failed already") diff --git a/crates/json-pawarser/src/lib.rs b/crates/json-pawarser/src/lib.rs index 05c529e..89160be 100644 --- a/crates/json-pawarser/src/lib.rs +++ b/crates/json-pawarser/src/lib.rs @@ -1,29 +1,3 @@ mod grammar; mod syntax_error; mod syntax_kind; - -#[cfg(test)] -mod test { - use pawarser::parser::ParserBuilder; - - use crate::{ - grammar::{value, Parser}, - syntax_kind::{lex, SyntaxKind}, - }; - - #[test] - fn test() { - const TEST_DATA: &str = r#"{"hello_world": "meow"}"#; - let toks = lex(TEST_DATA); - - let mut p: Parser = ParserBuilder::new(toks) - .add_meaningless(SyntaxKind::WHITESPACE) - .add_meaningless(SyntaxKind::NEWLINE) - .build(); - - value(&mut p); - - let out = p.finish(); - assert_eq!("", format!("{:#?}", out)) - } -} diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs index 45bb5bd..b607be1 100644 --- a/crates/json-pawarser/src/syntax_error.rs +++ b/crates/json-pawarser/src/syntax_error.rs @@ -2,7 +2,9 @@ use crate::syntax_kind::SyntaxKind; #[derive(Debug, Clone, PartialEq, Eq)] pub enum SyntaxError { + UnclosedObject, DisallowedKeyType(SyntaxKind), MemberMissingValue, + UnexpectedTrailingComma, } impl pawarser::parser::SyntaxError for SyntaxError {} diff --git a/crates/json-pawarser/src/syntax_kind.rs b/crates/json-pawarser/src/syntax_kind.rs index dfaab13..8713b2d 100644 --- a/crates/json-pawarser/src/syntax_kind.rs +++ b/crates/json-pawarser/src/syntax_kind.rs @@ -24,6 +24,9 @@ pub enum SyntaxKind { ARRAY, ELEMENT, + // SyntaxKinds for future json5/etc support + TRAILING_COMMA, + // Tokens // Regexes adapted from [the logos handbook](https://logos.maciej.codes/examples/json_borrowed.html) #[token("true")] From e5ccebe67982605b5437ae50b5d790bb641227ce Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 23 Oct 2024 13:01:39 +0200 Subject: [PATCH 178/189] add arrays --- crates/json-pawarser/src/grammar.rs | 48 +++++++++++++++++++++--- crates/json-pawarser/src/syntax_error.rs | 1 + 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index b7afe02..ce17972 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -1,3 +1,4 @@ +use array::array; use enumset::{enum_set, EnumSet}; use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; @@ -15,7 +16,7 @@ pub fn value(p: &mut Parser) -> bool { p.do_bump(); return true; } else { - object(p).is_some() + object(p).or_else(|| array(p)).is_some() } } @@ -35,13 +36,13 @@ mod object { member(p); while p.at(SyntaxKind::COMMA) { // not always an error, later configurable - let potential_unexpected_comma = p.start("potential_unexpected_comma"); + let potential_trailing_comma = p.start("potential_trailing_comma"); p.eat(SyntaxKind::COMMA); if member(p).is_none() { - potential_unexpected_comma.complete(p, SyntaxKind::TRAILING_COMMA); + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); } else { - potential_unexpected_comma.abandon(p); + potential_trailing_comma.abandon(p); } } @@ -84,4 +85,41 @@ mod object { } } } -mod array {} +mod array { + use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + + use super::{value, CompletedMarker, Parser}; + + pub(super) fn array(p: &mut Parser) -> Option { + let array_start = p.start("array"); + + if !p.eat(SyntaxKind::BRACKET_OPEN) { + array_start.abandon(p); + return None; + } + + let el = p.start("arr_el"); + value(p); + el.complete(p, SyntaxKind::ELEMENT); + + while p.at(SyntaxKind::COMMA) { + let potential_trailing_comma = p.start("potential_trailing_comma"); + + p.eat(SyntaxKind::COMMA); + let maybe_el = p.start("arr_el"); + if !value(p) { + maybe_el.abandon(p); + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + maybe_el.complete(p, SyntaxKind::ELEMENT); + potential_trailing_comma.abandon(p); + } + } + + Some(if !p.eat(SyntaxKind::BRACKET_CLOSE) { + array_start.error(p, SyntaxError::UnclosedArray) + } else { + array_start.complete(p, SyntaxKind::ARRAY) + }) + } +} diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs index b607be1..8c76de2 100644 --- a/crates/json-pawarser/src/syntax_error.rs +++ b/crates/json-pawarser/src/syntax_error.rs @@ -3,6 +3,7 @@ use crate::syntax_kind::SyntaxKind; #[derive(Debug, Clone, PartialEq, Eq)] pub enum SyntaxError { UnclosedObject, + UnclosedArray, DisallowedKeyType(SyntaxKind), MemberMissingValue, UnexpectedTrailingComma, From cee9b97dbfcb775784a400114d959bec1141c2e5 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 23 Oct 2024 13:27:36 +0200 Subject: [PATCH 179/189] extract modules to files --- crates/json-pawarser/src/grammar.rs | 105 +-------------------- crates/json-pawarser/src/grammar/array.rs | 36 +++++++ crates/json-pawarser/src/grammar/object.rs | 63 +++++++++++++ 3 files changed, 101 insertions(+), 103 deletions(-) create mode 100644 crates/json-pawarser/src/grammar/array.rs create mode 100644 crates/json-pawarser/src/grammar/object.rs diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index ce17972..36a707e 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -20,106 +20,5 @@ pub fn value(p: &mut Parser) -> bool { } } -mod object { - use crate::{grammar::value, syntax_error::SyntaxError, syntax_kind::SyntaxKind}; - - use super::{CompletedMarker, Parser, BASIC_VALUE_TOKENS}; - - pub(super) fn object(p: &mut Parser) -> Option { - let obj_start = p.start("object"); - - if !p.eat(SyntaxKind::BRACE_OPEN) { - obj_start.abandon(p); - return None; - } - - member(p); - while p.at(SyntaxKind::COMMA) { - // not always an error, later configurable - let potential_trailing_comma = p.start("potential_trailing_comma"); - p.eat(SyntaxKind::COMMA); - - if member(p).is_none() { - potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); - } else { - potential_trailing_comma.abandon(p); - } - } - - Some(if !p.eat(SyntaxKind::BRACE_CLOSE) { - obj_start.error(p, SyntaxError::UnclosedObject) - } else { - obj_start.complete(p, SyntaxKind::OBJECT) - }) - } - - fn member(p: &mut Parser) -> Option { - let member_start = p.start("member"); - - if p.at(SyntaxKind::BRACE_CLOSE) { - member_start.abandon(p); - return None; - } else if p.at(SyntaxKind::STRING) { - let member_name_start = p.start("member_name"); - p.eat(SyntaxKind::STRING); - member_name_start.complete(p, SyntaxKind::MEMBER_NAME); - } else { - return todo!("handle other tokens: {:?}", p.current()); - } - - if !p.eat(SyntaxKind::COLON) { - todo!("handle wrong tokens") - } - - let member_value_start = p.start("member_value_start"); - if value(p) { - member_value_start.complete(p, SyntaxKind::MEMBER_VALUE); - Some(member_start.complete(p, SyntaxKind::MEMBER)) - } else { - member_value_start.abandon(p); - let e = member_start.error(p, SyntaxError::MemberMissingValue); - Some( - e.precede(p, "member but failed already") - .complete(p, SyntaxKind::MEMBER), - ) - } - } -} -mod array { - use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; - - use super::{value, CompletedMarker, Parser}; - - pub(super) fn array(p: &mut Parser) -> Option { - let array_start = p.start("array"); - - if !p.eat(SyntaxKind::BRACKET_OPEN) { - array_start.abandon(p); - return None; - } - - let el = p.start("arr_el"); - value(p); - el.complete(p, SyntaxKind::ELEMENT); - - while p.at(SyntaxKind::COMMA) { - let potential_trailing_comma = p.start("potential_trailing_comma"); - - p.eat(SyntaxKind::COMMA); - let maybe_el = p.start("arr_el"); - if !value(p) { - maybe_el.abandon(p); - potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); - } else { - maybe_el.complete(p, SyntaxKind::ELEMENT); - potential_trailing_comma.abandon(p); - } - } - - Some(if !p.eat(SyntaxKind::BRACKET_CLOSE) { - array_start.error(p, SyntaxError::UnclosedArray) - } else { - array_start.complete(p, SyntaxKind::ARRAY) - }) - } -} +mod array; +mod object; diff --git a/crates/json-pawarser/src/grammar/array.rs b/crates/json-pawarser/src/grammar/array.rs new file mode 100644 index 0000000..18d4d2c --- /dev/null +++ b/crates/json-pawarser/src/grammar/array.rs @@ -0,0 +1,36 @@ +use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + +use super::{value, CompletedMarker, Parser}; + +pub(super) fn array(p: &mut Parser) -> Option { + let array_start = p.start("array"); + + if !p.eat(SyntaxKind::BRACKET_OPEN) { + array_start.abandon(p); + return None; + } + + let el = p.start("arr_el"); + value(p); + el.complete(p, SyntaxKind::ELEMENT); + + while p.at(SyntaxKind::COMMA) { + let potential_trailing_comma = p.start("potential_trailing_comma"); + + p.eat(SyntaxKind::COMMA); + let maybe_el = p.start("arr_el"); + if !value(p) { + maybe_el.abandon(p); + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + maybe_el.complete(p, SyntaxKind::ELEMENT); + potential_trailing_comma.abandon(p); + } + } + + Some(if !p.eat(SyntaxKind::BRACKET_CLOSE) { + array_start.error(p, SyntaxError::UnclosedArray) + } else { + array_start.complete(p, SyntaxKind::ARRAY) + }) +} diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs new file mode 100644 index 0000000..8cc2933 --- /dev/null +++ b/crates/json-pawarser/src/grammar/object.rs @@ -0,0 +1,63 @@ +use crate::{grammar::value, syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + +use super::{CompletedMarker, Parser, BASIC_VALUE_TOKENS}; + +pub(super) fn object(p: &mut Parser) -> Option { + let obj_start = p.start("object"); + + if !p.eat(SyntaxKind::BRACE_OPEN) { + obj_start.abandon(p); + return None; + } + + member(p); + while p.at(SyntaxKind::COMMA) { + // not always an error, later configurable + let potential_trailing_comma = p.start("potential_trailing_comma"); + p.eat(SyntaxKind::COMMA); + + if member(p).is_none() { + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + potential_trailing_comma.abandon(p); + } + } + + Some(if !p.eat(SyntaxKind::BRACE_CLOSE) { + obj_start.error(p, SyntaxError::UnclosedObject) + } else { + obj_start.complete(p, SyntaxKind::OBJECT) + }) +} + +fn member(p: &mut Parser) -> Option { + let member_start = p.start("member"); + + if p.at(SyntaxKind::BRACE_CLOSE) { + member_start.abandon(p); + return None; + } else if p.at(SyntaxKind::STRING) { + let member_name_start = p.start("member_name"); + p.eat(SyntaxKind::STRING); + member_name_start.complete(p, SyntaxKind::MEMBER_NAME); + } else { + return todo!("handle other tokens: {:?}", p.current()); + } + + if !p.eat(SyntaxKind::COLON) { + todo!("handle wrong tokens") + } + + let member_value_start = p.start("member_value_start"); + if value(p) { + member_value_start.complete(p, SyntaxKind::MEMBER_VALUE); + Some(member_start.complete(p, SyntaxKind::MEMBER)) + } else { + member_value_start.abandon(p); + let e = member_start.error(p, SyntaxError::MemberMissingValue); + Some( + e.precede(p, "member but failed already") + .complete(p, SyntaxKind::MEMBER), + ) + } +} From f7d05ead2c79dc283267b5225e27ab8f8527bc35 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 27 Oct 2024 16:56:39 +0100 Subject: [PATCH 180/189] rename trait meta syntaxkinds --- crates/json-pawarser/src/syntax_kind.rs | 6 ++++-- crates/pawarser/src/parser.rs | 7 ++++--- crates/pawarser/src/parser/input.rs | 2 +- crates/pawarser/src/parser/output.rs | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/json-pawarser/src/syntax_kind.rs b/crates/json-pawarser/src/syntax_kind.rs index 8713b2d..6e6b966 100644 --- a/crates/json-pawarser/src/syntax_kind.rs +++ b/crates/json-pawarser/src/syntax_kind.rs @@ -62,13 +62,15 @@ pub enum SyntaxKind { PARSE_ERR, // Meta SyntaxKinds + ROOT, EOF, } impl pawarser::parser::SyntaxElement for SyntaxKind { - const EOF: Self = Self::EOF; + const SYNTAX_EOF: Self = Self::EOF; - const ERROR: Self = Self::PARSE_ERR; + const SYNTAX_ERROR: Self = Self::PARSE_ERR; + const SYNTAX_ROOT: Self = Self::ROOT; } impl From for rowan::SyntaxKind { diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 2a666bf..3782f0f 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -26,9 +26,10 @@ where + Eq, { /// EOF value. This will be used by the rest of the parser library to represent an EOF. - const EOF: Self; + const SYNTAX_EOF: Self; /// Error value. This will be used as a placeholder for associated respective errors. - const ERROR: Self; + const SYNTAX_ERROR: Self; + const SYNTAX_ROOT: Self; } pub struct Parser<'src, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> { @@ -170,7 +171,7 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> NodeKind::Syntax(kind) => builder.start_node(kind.into()), NodeKind::Error(err) => { errors.push(err); - builder.start_node(SyntaxKind::ERROR.into()) + builder.start_node(SyntaxKind::SYNTAX_ERROR.into()) } _ => {} } diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs index a20d73d..d7e14b3 100644 --- a/crates/pawarser/src/parser/input.rs +++ b/crates/pawarser/src/parser/input.rs @@ -34,7 +34,7 @@ impl<'src, SyntaxKind: SyntaxElement> Input<'src, SyntaxKind> { pub fn kind(&self, idx: usize) -> SyntaxKind { let Some(meaningful_idx) = self.meaningful_toks.get(idx) else { - return SyntaxKind::EOF; + return SyntaxKind::SYNTAX_EOF; }; self.raw.get(*meaningful_idx).unwrap().0 diff --git a/crates/pawarser/src/parser/output.rs b/crates/pawarser/src/parser/output.rs index bea13e8..25b0c31 100644 --- a/crates/pawarser/src/parser/output.rs +++ b/crates/pawarser/src/parser/output.rs @@ -38,7 +38,7 @@ fn debug_print_output( match node { NodeOrToken::Node(n) => { let kind: SyntaxKind = node.kind().into(); - if kind != SyntaxKind::ERROR { + if kind != SyntaxKind::SYNTAX_ERROR { writeln!(f, "{:?} {{", kind)?; } else { let err = errs From 883b0c804e160cf06caba98390e6523f17d3f1df Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 27 Oct 2024 16:57:48 +0100 Subject: [PATCH 181/189] add implicit root node to avoid crash on multiple root nodes --- crates/pawarser/src/parser.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs index 3782f0f..c592cdb 100644 --- a/crates/pawarser/src/parser.rs +++ b/crates/pawarser/src/parser.rs @@ -120,6 +120,9 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> let mut errors: Vec = Vec::new(); raw_toks.reverse(); + // always have an implicit root node to avoid [`GreenNodeBuilder::finish()`] panicking due to multiple root elements. + builder.start_node(SyntaxKind::SYNTAX_ROOT.into()); + for i in 0..events.len() { match mem::replace(&mut events[i], Event::tombstone()) { Event::Start { @@ -185,6 +188,9 @@ impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> } } + // finish SYNTAX_ROOT + builder.finish_node(); + ParserOutput { green_node: builder.finish(), errors, From 958857cb58ffe1e2ca677908ee51101d022caf38 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Sun, 27 Oct 2024 17:21:42 +0100 Subject: [PATCH 182/189] handle debug pretty printing --- crates/pawarser/src/parser/output.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/pawarser/src/parser/output.rs b/crates/pawarser/src/parser/output.rs index 25b0c31..76c3cf7 100644 --- a/crates/pawarser/src/parser/output.rs +++ b/crates/pawarser/src/parser/output.rs @@ -31,34 +31,40 @@ fn debug_print_output( lvl: i32, errs: &mut Vec<&SyntaxErr>, ) -> std::fmt::Result { - for _ in 0..lvl { - f.write_str(" ")?; + if f.alternate() { + for _ in 0..lvl { + f.write_str(" ")?; + } } + let maybe_newline = if f.alternate() { "\n" } else { " " }; match node { NodeOrToken::Node(n) => { let kind: SyntaxKind = node.kind().into(); if kind != SyntaxKind::SYNTAX_ERROR { - writeln!(f, "{:?} {{", kind)?; + write!(f, "{:?} {{{maybe_newline}", kind)?; } else { let err = errs .pop() .expect("all error syntax nodes should correspond to an error"); - writeln!(f, "{:?}: {err:?} {{", kind)?; + write!(f, "{:?}: {err:?} {{{maybe_newline}", kind)?; } for c in n.children() { debug_print_output::(c, f, lvl + 1, errs)?; } - for _ in 0..lvl { - f.write_str(" ")?; + + if f.alternate() { + for _ in 0..lvl { + f.write_str(" ")?; + } } - f.write_str("}\n") + write!(f, "}}{maybe_newline}") } NodeOrToken::Token(t) => { - writeln!( + write!( f, - "{:?} {:?};", + "{:?} {:?};{maybe_newline}", Into::::into(t.kind()), t.text() ) From fcf91f25e31bcbbd023f62575012c9ea5d26e321 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 29 Oct 2024 19:36:32 +0100 Subject: [PATCH 183/189] json-pawarser: test stuffs uwu --- crates/json-pawarser/src/grammar.rs | 60 +++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index 36a707e..67af0f3 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -1,10 +1,17 @@ use array::array; use enumset::{enum_set, EnumSet}; +use pawarser::parser::ParserBuilder; -use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; +use crate::{ + syntax_error::SyntaxError, + syntax_kind::{lex, SyntaxKind}, +}; use self::object::object; +mod array; +mod object; + pub(crate) type Parser<'src> = pawarser::Parser<'src, SyntaxKind, SyntaxError>; pub(crate) type CompletedMarker = pawarser::CompletedMarker; @@ -20,5 +27,52 @@ pub fn value(p: &mut Parser) -> bool { } } -mod array; -mod object; +#[cfg(test)] +mod tests { + use super::{ + test_utils::{check_parser, gen_checks}, + value, + }; + + #[test] + fn value_lit() { + gen_checks! {value; + r#""helo world""# => r#"ROOT { STRING "\"helo world\""; }"#, + "42" => r#"ROOT { NUMBER "42"; }"#, + "null" => r#"ROOT { NULL "null"; }"#, + "true" => r#"ROOT { BOOL "true"; }"#, + "false" => r#"ROOT { BOOL "false"; }"# + }; + } +} + +#[cfg(test)] +mod test_utils { + use pawarser::parser::ParserBuilder; + + use crate::syntax_kind::{lex, SyntaxKind}; + + use super::Parser; + + macro_rules! gen_checks { + ($fn_to_test:ident; $($in:literal => $out:literal),+) => { + $(crate::grammar::test_utils::check_parser($in, |p| { $fn_to_test(p); }, $out);)+ + } + } + + pub(super) use gen_checks; + + pub(super) fn check_parser(input: &str, parser_fn: fn(&mut Parser), expected_output: &str) { + let toks = lex(input); + let mut p: Parser = ParserBuilder::new(toks) + .add_meaningless(SyntaxKind::WHITESPACE) + .add_meaningless(SyntaxKind::NEWLINE) + .build(); + + parser_fn(&mut p); + + let out = p.finish(); + + assert_eq!(format!("{out:?}").trim_end(), expected_output); + } +} From 662cb8ba0e7d1243307006cd77f2f952e4a38a41 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Tue, 29 Oct 2024 19:40:50 +0100 Subject: [PATCH 184/189] json-pawarser: make return of object grammar easier to understand --- crates/json-pawarser/src/grammar/object.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs index 8cc2933..d72dcdc 100644 --- a/crates/json-pawarser/src/grammar/object.rs +++ b/crates/json-pawarser/src/grammar/object.rs @@ -23,10 +23,10 @@ pub(super) fn object(p: &mut Parser) -> Option { } } - Some(if !p.eat(SyntaxKind::BRACE_CLOSE) { - obj_start.error(p, SyntaxError::UnclosedObject) - } else { + Some(if p.eat(SyntaxKind::BRACE_CLOSE) { obj_start.complete(p, SyntaxKind::OBJECT) + } else { + obj_start.error(p, SyntaxError::UnclosedObject) }) } From ef1a9f502936b1f38968bdca3ef06ee1481665b8 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 30 Oct 2024 10:57:52 +0100 Subject: [PATCH 185/189] json-pawarser: test grammar::member --- crates/json-pawarser/src/grammar/object.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs index d72dcdc..c1341fd 100644 --- a/crates/json-pawarser/src/grammar/object.rs +++ b/crates/json-pawarser/src/grammar/object.rs @@ -61,3 +61,17 @@ fn member(p: &mut Parser) -> Option { ) } } + +#[cfg(test)] +mod tests { + use crate::grammar::{object::member, test_utils::gen_checks}; + + #[test] + fn member_basic() { + gen_checks! {member; + r#""a": "b""# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } }"#, + r#""a": 42"# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } }"#, + r#""a":"# => r#"ROOT { MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } }"# + } + } +} From d809d3b52dd79425f15813aedade70e97e8167e1 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 30 Oct 2024 12:27:27 +0100 Subject: [PATCH 186/189] json-pawarser: test grammar::object --- crates/json-pawarser/src/grammar/object.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs index c1341fd..f021306 100644 --- a/crates/json-pawarser/src/grammar/object.rs +++ b/crates/json-pawarser/src/grammar/object.rs @@ -64,7 +64,22 @@ fn member(p: &mut Parser) -> Option { #[cfg(test)] mod tests { - use crate::grammar::{object::member, test_utils::gen_checks}; + use crate::grammar::{ + object::{member, object}, + test_utils::gen_checks, + }; + + #[test] + fn object_basic() { + gen_checks! {object; + r#"{"a": "b"}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": 42}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": "b""# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } } }"#, + r#"{"a": }"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } WHITESPACE " "; BRACE_CLOSE "}"; } }"#, + r#"{"a":"# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } } }"#, + r#"{"a":true,}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; MEMBER_VALUE { BOOL "true"; } } TRAILING_COMMA { COMMA ","; } BRACE_CLOSE "}"; } }"# + } + } #[test] fn member_basic() { From e581a8e7cf9c24a3c5b034278df942939da51e1c Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 20 Nov 2024 10:28:41 +0100 Subject: [PATCH 187/189] =?UTF-8?q?json-pawarser:=20format=20the=20checks?= =?UTF-8?q?=20=E2=9C=A8prettily=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/json-pawarser/src/grammar.rs | 8 ++++---- crates/json-pawarser/src/grammar/object.rs | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs index 67af0f3..bb94474 100644 --- a/crates/json-pawarser/src/grammar.rs +++ b/crates/json-pawarser/src/grammar.rs @@ -38,10 +38,10 @@ mod tests { fn value_lit() { gen_checks! {value; r#""helo world""# => r#"ROOT { STRING "\"helo world\""; }"#, - "42" => r#"ROOT { NUMBER "42"; }"#, - "null" => r#"ROOT { NULL "null"; }"#, - "true" => r#"ROOT { BOOL "true"; }"#, - "false" => r#"ROOT { BOOL "false"; }"# + "42" => r#"ROOT { NUMBER "42"; }"#, + "null" => r#"ROOT { NULL "null"; }"#, + "true" => r#"ROOT { BOOL "true"; }"#, + "false" => r#"ROOT { BOOL "false"; }"# }; } } diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs index f021306..02d9e73 100644 --- a/crates/json-pawarser/src/grammar/object.rs +++ b/crates/json-pawarser/src/grammar/object.rs @@ -72,11 +72,11 @@ mod tests { #[test] fn object_basic() { gen_checks! {object; - r#"{"a": "b"}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } BRACE_CLOSE "}"; } }"#, - r#"{"a": 42}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } BRACE_CLOSE "}"; } }"#, - r#"{"a": "b""# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } } }"#, - r#"{"a": }"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } WHITESPACE " "; BRACE_CLOSE "}"; } }"#, - r#"{"a":"# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } } }"#, + r#"{"a": "b"}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": 42}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": "b""# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } } }"#, + r#"{"a": }"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } WHITESPACE " "; BRACE_CLOSE "}"; } }"#, + r#"{"a":"# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } } }"#, r#"{"a":true,}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; MEMBER_VALUE { BOOL "true"; } } TRAILING_COMMA { COMMA ","; } BRACE_CLOSE "}"; } }"# } } @@ -85,8 +85,8 @@ mod tests { fn member_basic() { gen_checks! {member; r#""a": "b""# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } }"#, - r#""a": 42"# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } }"#, - r#""a":"# => r#"ROOT { MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } }"# + r#""a": 42"# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } }"#, + r#""a":"# => r#"ROOT { MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } }"# } } } From 94fa1bf8565a2682dee39ca4e38c4eb50cf380da Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Thu, 28 Nov 2024 09:14:22 +0100 Subject: [PATCH 188/189] json-pawarser: add array tests --- crates/json-pawarser/src/grammar/array.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/json-pawarser/src/grammar/array.rs b/crates/json-pawarser/src/grammar/array.rs index 18d4d2c..3ae1726 100644 --- a/crates/json-pawarser/src/grammar/array.rs +++ b/crates/json-pawarser/src/grammar/array.rs @@ -34,3 +34,19 @@ pub(super) fn array(p: &mut Parser) -> Option { array_start.complete(p, SyntaxKind::ARRAY) }) } + +#[cfg(test)] +mod tests { + use crate::grammar::{array::array, test_utils::gen_checks}; + + #[test] + fn array_basic() { + gen_checks! {array; + r#"[1,2,3]"# => r#"ROOT { ARRAY { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } COMMA ","; ELEMENT { NUMBER "3"; } BRACKET_CLOSE "]"; } }"#, + r#"[1,2,]"# => r#"ROOT { ARRAY { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } TRAILING_COMMA { COMMA ","; } BRACKET_CLOSE "]"; } }"#, + r#"[1,2"# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } } }"#, + r#"[1,2,"# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } TRAILING_COMMA { COMMA ","; } } }"#, + r#"[{"hello":"world""# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"hello\""; } COLON ":"; MEMBER_VALUE { STRING "\"world\""; } } } } } }"# + } + } +} From d9ef86387d4dd129e51111d7f984d84f9d922ba6 Mon Sep 17 00:00:00 2001 From: Schrottkatze Date: Wed, 1 Jan 2025 22:27:00 +0100 Subject: [PATCH 189/189] add new, depressing welcome message inspired by https://furry.engineer/@nil/113755060125563709 --- crates/app/src/welcome_msg.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/app/src/welcome_msg.rs b/crates/app/src/welcome_msg.rs index a3e15a3..63b7601 100644 --- a/crates/app/src/welcome_msg.rs +++ b/crates/app/src/welcome_msg.rs @@ -13,4 +13,10 @@ pub fn print_startup_msg() { } else { println!("Hello, thanks for using iOwO! :3"); } + if now.year() >= 2100 { + println!("Is your system time set correctly? If yes, ... wow, humanity still exists! :0"); + println!( + "Given current politics, I'm surprised we as a species made it another 75 years..." + ); + } }

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%0D=Elu^k~Iat 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