commit de2d22814363c1926f1ac85a9b748b89b9b88ea9 Author: DOOME1M8Cover Date: Thu Jun 15 13:10:20 2023 +0100 Initial Commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad1ba3b --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + + +# Docs build +/docs/.cache/ diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..70177a0 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "comline" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.71" +once_cell = "1.17.1" +pest = "2.6.0" +pest_derive = "2.6.0" +rmp = "0.8.11" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ee92c39 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 NewWars + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..24764b8 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# comline-rs + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..1e38211 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,4 @@ +# Docs + + +## Resource Links diff --git a/docs/docs/codegen/index.md b/docs/docs/codegen/index.md new file mode 100644 index 0000000..f46e645 --- /dev/null +++ b/docs/docs/codegen/index.md @@ -0,0 +1,9 @@ +## Motivations + +Comparing to other libraries: +as for example in contrast compared with Protobuf's gRPC codegen +implementations for some languages that might lack more concrete details, +they mildly specify Message typing, but do not provide enough Service +typing information to help IDE tools in showing or optionally enforcing +through abstraction interfaces (if the language has them) + diff --git a/docs/docs/idl/docstrings.md b/docs/docs/idl/docstrings.md new file mode 100644 index 0000000..8894b4a --- /dev/null +++ b/docs/docs/idl/docstrings.md @@ -0,0 +1,11 @@ +# Documentation String + +// TODO: Think about this, it was a quick thought about docstrings +// that able showed about commands on minecraft +// https://discord.com/channels/273534239310479360/273539705595756544/1116664750294716427 +```cpp +/// Send a message to someone +/// @message: Message to send +/// !returns: If the message was send with success +fn send_message(message: Message) -> bool +``` diff --git a/docs/docs/idl/enum.md b/docs/docs/idl/enum.md new file mode 100644 index 0000000..165d64a --- /dev/null +++ b/docs/docs/idl/enum.md @@ -0,0 +1,10 @@ +# Enum + +``` py linenums="1" +enum Deliver { + To + Reply + Forward +} +``` + diff --git a/docs/docs/idl/index.md b/docs/docs/idl/index.md new file mode 100644 index 0000000..034c0c0 --- /dev/null +++ b/docs/docs/idl/index.md @@ -0,0 +1,13 @@ +# Summary +IDL (stands for Interface Description Language) which +can also be called a schema format, is used to define properties +like settings, structures, enumerations, errors, protocols, etc... + + + +## Icons and Emojs +:smile: +:fontawesome-regular-face-laugh-wink: +:fontawesome-brands-twitter:{ .twitter } +:octicons-heart-fill-24:{ .heart } + diff --git a/docs/docs/idl/protocol.md b/docs/docs/idl/protocol.md new file mode 100644 index 0000000..8eff901 --- /dev/null +++ b/docs/docs/idl/protocol.md @@ -0,0 +1,8 @@ +# Protocol + +``` py linenums="1" +protocol Mail { + fn send_message() -> +} +``` + diff --git a/docs/docs/idl/settings.md b/docs/docs/idl/settings.md new file mode 100644 index 0000000..0a97cae --- /dev/null +++ b/docs/docs/idl/settings.md @@ -0,0 +1,25 @@ +# Settings +``` py linenums="1" +setting { + index-all=True # Make structures, enums, errors protocols indexing explicit by default + index-structs=True # Make structures indexing explicit by default + index-enums=True # Make enums indexing explicit by default + index-errors=True # Make errors indexing explicit by default + index-protocols=True # Make protocols indexing explicit by default + + forbid-default-index-all=False # Forbid indexing explicit for any component by default + forbid-default-index-structs=False # Forbid indexing explicit for structs by default + forbid-default-index-enums=False # Forbid indexing explicit for enums by default + forbid-default-index-errors=False # Forbid indexing explicit for errors by default + forbid-default-index-protocols=False # Forbid indexing explicit for protocols by default + + forbid-index-all=False # Forbid indexing entirely for any component by default + forbid-index-structs=False # Forbid indexing entirely for structs by default + forbid-index-enums=False # Forbid indexing entirely for enums by default + forbid-index-errors=False # Forbid indexing entirely for errors by default + forbid-index-protocols=False # Forbid indexing entirely for protocols by default +} +``` +Values for each **parameter** above are the **default** value, which you +can change to affect the whole schema + diff --git a/docs/docs/idl/structure.md b/docs/docs/idl/structure.md new file mode 100644 index 0000000..f2ae634 --- /dev/null +++ b/docs/docs/idl/structure.md @@ -0,0 +1,21 @@ +# Structure +A **structure** (also called **struct** or **message**) defines +the properties of the data carried and set on their **fields**, +for each field, they also have properties of their own like **index**, +**type** and **default** value + +``` py linenums="1" +struct Message { + 1# sender: str = "Bee" + 2# deliver: Deliver = Deliver::To + 3# recipient: str = "Flower" +} +``` + +## Field +A field has a index, a **name** (also called **id**), a **type**, and +optionally a **default** value +```py linenums="1" +1# optional sender: str = "Bee" +``` + diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000..ac72e10 --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,45 @@ +# Welcome to Comline +Comline is an agnostic schema, RPC/IPC (or any other similar terminologies) +library, similar to ones like: + + - [Protobuf](https://protobuf.dev/), [Capn'Proto](https://capnproto.org/), [Fuchsia IDL (FIDL)](https://fuchsia.dev/fuchsia-src/get-started/sdk/learn/fidl) + - [Apache Avro](https://avro.apache.org/), [Apache Thrift](https://thrift.apache.org/docs/idl) + + +## What constitutes Comline? + +### [Interface Definition Language (IDL or also named Schema)](./idl/index.md) +Some of the distinct differences to other libraries is that this +[IDL/Schema](./idl/index.md) allows to be more flexible, optional or robust, +detailed and specific when setting options, rules, message structures, +protocols (named services in protobuf, interfaces in capn'proto) and so on... + + +### [Intermediate Representation (IR)](./ir/index.md) +Schemas compile into an Intermiate Representation that solidifies the structure as a sort of "mini-spec", +which then can output to other formats like a rpc schema such as +[OpenRPC](https://open-rpc.org/), a custom text format, or better a binary +compact format like [msgpack](https://msgpack.org/) which is ideal to reduce wire load + + +### [Call System (CaSy)](./casy/index.md) +Yet another one is that the call system can be provided and the library is able +to do the intended routing, so specs like [json-rpc](https://www.jsonrpc.org/) +can be used, or a custom format that is binary compact like msgpack, or any +custom call format that you may need to use or implement + +Even another one is that the message serialization can be specified so that +you can use any data format, from JSON to even other schema library's formats, +or once again binary minimalist formats like msgpack +(might sound repetitive, but it's just a good format for many cases) + + +### [Code Generation (Codegen)](./codegen/index.md) +Codegen is a common feature that similar libraries have, however +some of them lack details at development time and might make the experience +more indicated towards "try-it-out" and not provide so much detail, + +Comline tries to provide more language specific generation that fits as best, +detailed and information specific to them as possible, be it for compiled +or dynamic languages, it's believed to be important to have as much information +detail as possible at development type. diff --git a/docs/docs/ir/index.md b/docs/docs/ir/index.md new file mode 100644 index 0000000..df6f151 --- /dev/null +++ b/docs/docs/ir/index.md @@ -0,0 +1,3 @@ +# Summary + + diff --git a/docs/docs/planning.md b/docs/docs/planning.md new file mode 100644 index 0000000..ee7ae51 --- /dev/null +++ b/docs/docs/planning.md @@ -0,0 +1,5 @@ +# Project planning + +A very good contextually conversation of thoughts and improvement changes: + +[Discord](https://discord.com/channels/273534239310479360/273539705595756544/1106395278325583965) diff --git a/docs/docs/planning/generation.md b/docs/docs/planning/generation.md new file mode 100644 index 0000000..53060a2 --- /dev/null +++ b/docs/docs/planning/generation.md @@ -0,0 +1,47 @@ +# Generation Proposals + +## + +## Proposals for Schema into IR into Codegen +From the following schema: +=== "IDL" + ```cpp + struct Message { + receiver: string + } + ``` + +#### Generation for Compiled Languages +Generates the respective code for the languages: + +=== "Rust" + ```rs + trait Message { + fn receiver() -> String; + fn subject() -> String; + fn message() -> String; + } + ``` + + +#### Generation for Dynamic Languages +Generates the respective code for the languages: + +=== "Python" + + ```py + class Message(Protocol): + receiver: string + subject: string + message: string + ``` + +=== "TypeScript" + + ```ts + interface Message { + receiver: string + subject: string + message: string + } + ``` diff --git a/docs/docs/planning/index.md b/docs/docs/planning/index.md new file mode 100644 index 0000000..9e7644c --- /dev/null +++ b/docs/docs/planning/index.md @@ -0,0 +1,21 @@ +# Planning and Proposals + + +!!! example + + === "Unordered List" + + ``` markdown + * Sed sagittis eleifend rutrum + * Donec vitae suscipit est + * Nulla tempor lobortis orci + ``` + + === "Ordered List" + + ``` markdown + 1. Sed sagittis eleifend rutrum + 2. Donec vitae suscipit est + 3. Nulla tempor lobortis orci + ``` + diff --git a/docs/docs/planning/syntax.md b/docs/docs/planning/syntax.md new file mode 100644 index 0000000..5e899a8 --- /dev/null +++ b/docs/docs/planning/syntax.md @@ -0,0 +1,2 @@ +# Syntax Proposals + diff --git a/docs/docs/planning/syntax/proposal #1.md b/docs/docs/planning/syntax/proposal #1.md new file mode 100644 index 0000000..b666c96 --- /dev/null +++ b/docs/docs/planning/syntax/proposal #1.md @@ -0,0 +1,10 @@ +# Syntax Proposal #1 + + +```cpp + +``` + + +## Compilation into IR +On diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 0000000..232be64 --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,92 @@ +site_name: Comline + +nav: + - Home: 'index.md' + - Project Planing: 'planning.md' + - 'IDL (Interface Description Language)': + - 'idl/index.md' + - Settings: 'idl/settings.md' + - Structure: 'idl/structure.md' + - Enum: 'idl/enum.md' + - Protocol: 'idl/protocol.md' + - Docstrings: "idl/docstrings.md" + - 'IR (Intermediate Representation)': + - 'ir/index.md' + + +theme: + name: material + features: + - navigation.tabs + - navigation.sections + - toc.integrate + - navigation.top + - search.suggest + - search.highlight + - content.tabs.link + - content.code.annotation + - content.code.copy + language: en + palette: + - scheme: default + toggle: + icon: material/weather-night + name: Switch to dark mode + primary: teal + accent: purple + + - scheme: slate + toggle: + icon: material/weather-sunny + name: Switch to light mode + primary: teal + accent: lime + + +# TODO: The social plugin is disabled due to not Cairo lib not being available on Nix +#plugins: +# - social + +#extra: +# social: +# - icon: fontawesome/brands/github-alt +# link: https://github.com/james-willett +# - icon: fontawesome/brands/twitter +# link: https://twitter.com/TheJamesWillett +# - icon: fontawesome/brands/linkedin +# link: https://www.linkedin.com/in/willettjames/ + + version: + provider: mike + default: stable + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + + - pymdownx.inlinehilite + - pymdownx.snippets + - admonition + + - pymdownx.arithmatex: + generic: true + + - pymdownx.tabbed: + alternate_style: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + + - footnotes + - pymdownx.details + - pymdownx.superfences + - pymdownx.mark + - attr_list + + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + + +copyright: | + © 2023 comline-rs diff --git a/docs/poetry.lock b/docs/poetry.lock new file mode 100644 index 0000000..6ca9e84 --- /dev/null +++ b/docs/poetry.lock @@ -0,0 +1,758 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markdown" +version = "3.3.7" +description = "Python implementation of Markdown." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, +] + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mike" +version = "1.1.2" +description = "Manage multiple versions of your MkDocs-powered documentation" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "mike-1.1.2-py3-none-any.whl", hash = "sha256:4c307c28769834d78df10f834f57f810f04ca27d248f80a75f49c6fa2d1527ca"}, + {file = "mike-1.1.2.tar.gz", hash = "sha256:56c3f1794c2d0b5fdccfa9b9487beb013ca813de2e3ad0744724e9d34d40b77b"}, +] + +[package.dependencies] +jinja2 = "*" +mkdocs = ">=1.0" +pyyaml = ">=5.1" +verspec = "*" + +[package.extras] +dev = ["coverage", "flake8 (>=3.0)", "shtab"] +test = ["coverage", "flake8 (>=3.0)", "shtab"] + +[[package]] +name = "mkdocs" +version = "1.4.3" +description = "Project documentation with Markdown." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.4.3-py3-none-any.whl", hash = "sha256:6ee46d309bda331aac915cd24aab882c179a933bd9e77b80ce7d2eaaa3f689dd"}, + {file = "mkdocs-1.4.3.tar.gz", hash = "sha256:5955093bbd4dd2e9403c5afaf57324ad8b04f16886512a3ee6ef828956481c57"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.2.1,<3.4" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-material" +version = "9.1.15" +description = "Documentation that simply works" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material-9.1.15-py3-none-any.whl", hash = "sha256:b49e12869ab464558e2dd3c5792da5b748a7e0c48ee83b4d05715f98125a7a39"}, + {file = "mkdocs_material-9.1.15.tar.gz", hash = "sha256:8513ab847c9a541ed3d11a3a7eed556caf72991ee786c31c5aac6691a121088a"}, +] + +[package.dependencies] +colorama = ">=0.4" +jinja2 = ">=3.0" +markdown = ">=3.2" +mkdocs = ">=1.4.2" +mkdocs-material-extensions = ">=1.1" +pygments = ">=2.14" +pymdown-extensions = ">=9.9.1" +regex = ">=2022.4.24" +requests = ">=2.26" + +[[package]] +name = "mkdocs-material-extensions" +version = "1.1.1" +description = "Extension pack for Python Markdown and MkDocs Material." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, + {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pymdown-extensions" +version = "10.0.1" +description = "Extension pack for Python Markdown." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, +] + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "regex" +version = "2023.6.3" +description = "Alternative regular expression module, to replace re." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "verspec" +version = "0.1.0" +description = "Flexible version handling" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "verspec-0.1.0-py3-none-any.whl", hash = "sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31"}, + {file = "verspec-0.1.0.tar.gz", hash = "sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e"}, +] + +[package.extras] +test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "ce80fa802ddadce5c76b7078f8f7f882fec5dc4efa50143dd2cbb9142ed0674b" diff --git a/docs/pyproject.toml b/docs/pyproject.toml new file mode 100644 index 0000000..468268c --- /dev/null +++ b/docs/pyproject.toml @@ -0,0 +1,21 @@ +[tool.poetry] +name = "comline-docs" +version = "0.1.0" +description = "" +authors = ["DOOME1M8"] +readme = "README.md" +# packages = [{include = "comline_docs"}] + +[tool.poetry.dependencies] +python = "^3.10" +mkdocs = "^1.4.3" +mkdocs-material = "^9.1.11" +pillow = "^9.5.0" +# cairosvg = "^2.7.0" +mike = "^1.1.2" + + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/examples/dev.cls b/examples/dev.cls new file mode 100644 index 0000000..0b2bf4b --- /dev/null +++ b/examples/dev.cls @@ -0,0 +1,47 @@ +tag @? +namespace examples.full + +// Standard Imports +import std::str::StringBounds + +settings { + indexed-all=false + allow-debugging=true +} + +settings MailSettings(struct, protocol) { + indexed=true +} + +@settings=MailSettings +struct Mail { + 1# sender: str + 2# recipient: str +} + +struct Article { + @validators=[StringBounds(min_chars=3 max_chars=32] + 1# title: str + + @validators=[StringBounds(min_chars=24 max_chars=412] + 2# content: str +} + +@hidden +@settings=MailSettings +protocol Mail { + 1# async function send(Mail) +} + + +// Maximum amount of articles that a provider can send +const SENT_ARTICLES_MAX: u8 = 10 + +//#provider=Server // TODO: This is the original proposal, it would only dictate direction, below is the new proposal +#provider=Multiple consumer=Multiple // TODO: These parameters need more situational introspection to be documented +protocol Feed { + // Fetches new articles since last fetch + @flexible async stream + #timeout=1000ms per_send_timeout=10s cooldown=10s + 1# function fetch_articles() -> Article[SENT_ARTICLES_MAX] +} diff --git a/examples/example.cls b/examples/example.cls new file mode 100644 index 0000000..d003cbb --- /dev/null +++ b/examples/example.cls @@ -0,0 +1,70 @@ +// TODO: Think if the IDL should compile into a IR (Intermediate Representation) + +// Identifier for this schema, every identifier should be unique, generated by the schema compiler +// so its not necessary to do this manually +tag 0563125512 + +// Namespacing for the package as per usual schemas do +namespace examples.thing.basic + + +settings { + // This option makes so messages(consequentially structs) by default do not require to specify a succession index, + // and so this makes that both caller and provider are required to communicate on the same schema version + indexed_fields = false +} + +// Imports from standard library schema types or from other schemas + + +// Constants are immutable values that exist permanently in schema types, useful for universal references +const WORLD_COUNT u8 = 10 + + +// A basic message structure with versioning, the default is versioned unless specified so +struct MessageVersioned { + optional str world_name: 1 + str person_name: 2 +} + +// A basic message structure without versioning +struct Message versioned=False { + str world_name +} + + +// Protocol definition that can be used for RPC, IPC or anything of the likes you can turn it into. +// The »provider« setting means that this protocol should be served by a Server, or a Client, or both +// its useful for limiting who can make cals to who. +// You can still specify per function who calls who, the field is for default behavior +protocol World provider=Server { + // One-way call that only the client can do to the server, synchronous, no return + // since its synchronous, the call will still be blocking on the caller until the provider is done processing it + function hello() + + // Similar to above, one-way, no return, but this time asynchronous so the caller won't wait, and the provider + // won't send a signal to the caller saying that it is done + async function hello_await() + + // Two-way call, both client and server are providers and callers + async client server function hello_both() + + // One-way call, asynchronous, single return, since its asynchronous and a return is specified, + // the caller has the option to await or to be blocking, since it doesn't impact the provider + async function hello_back() -> str + + // Two-way call, both client and server are providers and callers, and returns a value, similar as above + async client server function hello_back_both() -> str + + // Two-way call, both client and server are providers and callers, and returns a value, similar as above + // difference being a timeout is specified, so if the call process time exceeds the time til return, + // the caller will abort waiting for the response or return signal + async client server function hello_back_both() -> str: timeout_ms=1000 +} + + +// TODO: Think what »discoverable« should mean, just like Fuchsia IDL +@discoverable +protocol OpenWorld { +} + diff --git a/examples/greet.cls b/examples/greet.cls new file mode 100644 index 0000000..008a835 --- /dev/null +++ b/examples/greet.cls @@ -0,0 +1,26 @@ +namespace example.test +const SOMETHING: str = test + +settings { + // Make indexing default in parts desired + indexed_schema=True // Everything indexed + indexed_structures=True + indexed_enums=True + indexed_protocols=True + + // Forbid indexing for in parts desired + forbid_non_indexing=False + forbid_struct_indexing=False + forbid_enum_indexing=False + forbid_protocol_indexing=False +} + +enum Motion { + 1# Wave + 2# Turn +} + +struct Greet { + +} + diff --git a/examples/imports/ant.cls b/examples/imports/ant.cls new file mode 100644 index 0000000..0ac49fb --- /dev/null +++ b/examples/imports/ant.cls @@ -0,0 +1,4 @@ +namespace examples.imports.ant + +settings { +} diff --git a/examples/imports/food.cls b/examples/imports/food.cls new file mode 100644 index 0000000..3a622c4 --- /dev/null +++ b/examples/imports/food.cls @@ -0,0 +1 @@ +namespace examples.imports.ant diff --git a/examples/imports/hole.cls b/examples/imports/hole.cls new file mode 100644 index 0000000..f557c73 --- /dev/null +++ b/examples/imports/hole.cls @@ -0,0 +1,15 @@ +namespace examples.imports.ant + +// Imports whole schemas by name from a underlying namespace +import examples::imports::{ant food} + +// Or imports exactly the components you want like structures, enums and errors +import examples::imports::ant {Ant, Mood, CantCarryError} +import examples::imports::food {Food, State, NotEdibleError} + +settings { +} + +protocol Gathering { + +} \ No newline at end of file diff --git a/examples/simple.cls b/examples/simple.cls new file mode 100644 index 0000000..9bc1ca2 --- /dev/null +++ b/examples/simple.cls @@ -0,0 +1,67 @@ +namespace examples.thing.simple + +const AGREEMENT_KEY: string = "agreement_key" + + +validator StringBounds min_chars=0 max_chars=1024 { + assert_error( + value.length > params.max_chars or value.length < params.min_chars, + "String {value.name} must be more than {params.min_chars} and less than {params.max_chars}" + ) +} + +validator PasswordCheck min_chars=16 max_chars=60 { + assert_validate(StringBounds(min_chars=params.min_chars max_chars=params.max_chars) +} + +@settings(versioned=False validate_fields=False) +struct Credentials { + @validators([StringBounds(min_chars=8 max_chars=16)]) + 1# username: str = "test" + + @validators=[PasswordCheck()] + 2# password: str +} + +struct CredentialsOther { + #1 username: union ( + str [validators=[StringBounds(min_chars=8 max_chars=16]], + null + ) = "test" | null + + #2 password: str [validators=[PasswordCheck()]] +} + +enum RegisterStatus { + Ok + UsernameTaken +} + +error TellBackError back="Foo" { + message = "Could not get the provider to tell \"{back}\" back" +} + +protocol Registry provider=Server { + + @argument.0.username.validate=true + #timeout_ms=100 + #cooldown_ms=200 + function register(Credentials) returns RegisterStatus + + @return.0.validators=[StringBounds(min_chars=8)] + function my_username() returns str + + @return.0.validators=[StringBounds(min_chars=8)] + function tell_back(str = "back") returns str throws TellBackError + +} + +struct TellBackResponse { + +} + +@ +protocol Events provider=Server { + async function poke() +} + diff --git a/examples/simple_gen.rs b/examples/simple_gen.rs new file mode 100644 index 0000000..112a270 --- /dev/null +++ b/examples/simple_gen.rs @@ -0,0 +1,21 @@ + + +trait Registry { + fn register(message: Credentials) -> RegisterStatus; + fn my_username() -> String; + fn tell_back(message: String) -> Result; +} + +#[derive(ValidatorStringBounds<[u8; 8]>)] +struct Credentials { + +} + +struct RegisterStatus { + +} + +struct TellBackError { + +} + diff --git a/src/codegen.rs b/src/codegen.rs new file mode 100644 index 0000000..142d5f4 --- /dev/null +++ b/src/codegen.rs @@ -0,0 +1 @@ +mod rust; \ No newline at end of file diff --git a/src/codegen/rust.rs b/src/codegen/rust.rs new file mode 100644 index 0000000..0b9bb2c --- /dev/null +++ b/src/codegen/rust.rs @@ -0,0 +1,75 @@ +// Standard Uses + +// Local Uses +use crate::ir::unit::{Protocol, Unit}; + +// External Uses + +fn unit_to_code(unit: Unit) -> String { + let mut code = String::new(); + + match unit { + Unit::Items(_) => {} + Unit::Tag(_) => {} + Unit::Namespace(_) => {} + Unit::Imports(_) => {} + Unit::Settings(_) => {} + Unit::Consts(_) => {} + Unit::Structs(_) => {} + Unit::Enums(_) => {} + Unit::Errors(_) => {} + Unit::Protocols(protocols) => { + for protocol in protocols { + code.push_str(&*protocol_to_code(protocol)) + } + } + } + + code +} +fn protocol_to_code(protocol: Protocol) -> String { + let mut code = String::new(); + + // Trait Start + // TODO: Maybe only include async_trait if at least one of the functions need it + code.push_str("#[async_trait]"); + code.push_str(&*format!("pub trait {} {{", protocol.id)); + + // Functions + for function in protocol.functions { + let mut fn_code = String::new(); + + // Async definition (with async_trait) + if function.async_ { + fn_code.push_str("async "); + } + + // Fn + fn_code.push_str(&*format!("fn {} (", function.id)); + + // Arguments + let mut idx = 0; + while idx != function.arguments.len() { + let argument = function.arguments.get(idx).unwrap(); + + if argument.id.is_none() { + fn_code.push_str(&*format!("arg{}: {:?}", idx, argument.type_)); + if idx != function.arguments.len() { fn_code.push_str(", ") } + } else { + fn_code.push_str(&*format!("{}: {:?}", argument.id.clone().unwrap(), argument.type_)); + if idx != function.arguments.len() { fn_code.push_str(", ") } + } + + idx += 1; + } + + // Returns + + code.push_str(&*fn_code) + } + + // Trait End + code.push_str("}}"); + + code.to_owned() +} diff --git a/src/idl.rs b/src/idl.rs new file mode 100644 index 0000000..75f6a5d --- /dev/null +++ b/src/idl.rs @@ -0,0 +1 @@ +pub mod pest; \ No newline at end of file diff --git a/src/idl/idl.pest b/src/idl/idl.pest new file mode 100644 index 0000000..7e28758 --- /dev/null +++ b/src/idl/idl.pest @@ -0,0 +1,127 @@ +// IDL grammar +schema = _{ namespace ~ (COMMENT | settings | constant | validator | enumeration | structure | error | protocol)* } + +namespace = { "namespace" ~ WS ~ domain ~ WS } + +constant = { "const" ~ WS ~ id ~ WS? ~ ":" ~ WS ~ kind ~ WS ~ ("=" ~ WS ~ value)? ~ WS? } + +settings = { + "settings" ~ WS? ~ id? ~ WS? ~ + "{" ~ WS? ~ parameter* ~ WS? ~"}" + ~ WS? +} + +enumeration = { + "enum" ~ WS ~ id ~ WS? ~ parameter* ~ WS? ~ + "{" ~ WS? ~ enum_variant+ ~ WS? ~ "}" + ~ WS? +} +enum_variant = { digit+ ~ WS? ~ "#" ~ WS ~ id ~ WS? } + +validator = { + "validator" ~ WS ~ id ~ WS? ~ parameter* ~ WS? ~ + "{" ~ WS? ~ function_call* ~ WS? ~ "}" + ~ WS? +} + +// TODO: This is a temporary arragement of +// possibly used chars in a expression, +// a real comprehension needs to be done +expression = { + (operation ~ WS? ~ boolean_operator? ~ WS?)+ +} +function_call = { + id ~ WS? ~ "(" ~ WS? ~ + (","? ~ WS? ~ function_call_arg)* + ~ WS? ~ ")" ~ WS? +} +function_call_arg = { + expression | string_interpolated +} + +string_interpolated = { + "\"" ~ + (string | WS | + ("{" ~ domain ~ "}"))* + ~ "\"" +} +string = @{ (alpha | digit | WS+)+ } + + +entity = { digit+ | domain } +operation = { + (entity ~ WS? ~ operator ~ WS? + ~ (expression | entity)+) + +} +operator = { + "==" | "!=" | "<" | ">" | "+" | "-" | "/" | "|" +} +boolean_operator = { + "or" | "and" +} + +structure = { + "struct" ~ WS ~ id ~ WS? ~ parameter* ~ WS? ~ + "{" ~ WS? ~ (constant | field)+ ~ WS? ~ "}" + ~ WS? +} +field = { + (index ~ "#")? ~ (WS? ~ requirement)? ~ + WS? ~ id ~ WS? ~ ":" ~ WS? ~ kind ~ + (WS? ~ "=" ~ WS? ~ value)? ~ WS? +} +index = { digit } +requirement = { "optional" } + +error = { + "error" ~ WS ~ id ~ WS? ~ parameter* ~ WS? ~ + "{" ~ WS? ~ (parameter | field)+ ~ WS? ~ "}" ~ WS? +} + +protocol = { + "protocol" ~ WS ~ id ~ WS? ~ parameter* ~ WS? ~ + "{" ~ WS? ~ function+ ~ "}" ~ WS? +} +function = { + (index ~ WS? ~ "#" ~ WS?)? ~ + (asynchronous ~ WS?)? ~ + (direction ~ WS?)? ~ + "function" ~ WS ~ id ~ WS? ~ + "(" ~ WS? ~ argument* ~ WS? ~ ")" ~ WS? ~ + ("->" ~ WS? ~ returns+ ~ WS?)? ~ + (":" ~ WS? ~ parameter+ ~ WS?)? ~ + ("!" ~ WS? ~ throw+ ~ WS?)? ~ + WS? +} +direction = { "client" | "server" } + +asynchronous = { "async" } +argument = { + ","? ~ WS? ~ + ((id ~ WS? ~ ":" ~ WS? ~ kind) | kind) + ~ WS? +} +returns = { ","? ~ WS? ~ (kind) ~ WS? } +parameter = { + ","? ~ WS? ~ id ~ WS? ~ "=" ~ WS? ~ value ~ WS? +} +throw = { + ","? ~ WS? ~ id ~ WS? +} + +domain = @{ (id | ".")+ } +id = @{ (alpha | "_")+ } +kind = @{ (alpha | digit)+ } + +// Replace text with match anything inside " " +value = { ("\"" ~ inner_string ~ "\"") | inner_namespaced } +inner_string = @{ (alpha | digit | WS | "{" | "}" | ".")+ } +inner_namespaced = @{ (alpha | digit | "::")+ } + +alpha = { 'a'..'z' | 'A'..'Z' } +digit = { '0'..'9' } + +WS = _{ (" " | "\t" | "\n")+ } +COMMENT = _{ "//" ~ (!NEWLINE ~ ANY)* ~ NEWLINE } +// MULTILINE_COMMENT = _{ "/*" ~ (MULTILINE_COMMENT | !"*/" ~ ANY)* ~ "*/" } diff --git a/src/idl/pest.rs b/src/idl/pest.rs new file mode 100644 index 0000000..0fd42f2 --- /dev/null +++ b/src/idl/pest.rs @@ -0,0 +1,270 @@ +// Standard Uses + +// Local Uses +use crate::ir::primitive; +use crate::ir::primitive::TypeValue; +use crate::ir::unit::{Argument, Const, Direction, Enum, EnumVariant, Error, Field, Function, Parameter, Protocol, Settings, Struct, Unit}; + +// External Uses +use anyhow::Result; +use pest::iterators::{Pair, Pairs}; +use pest::Parser; + + +#[derive(Parser)] +#[grammar = "idl/idl.pest"] +pub struct IDLParser; + + +pub fn parse_into_unit(raw: &str) -> Result { + let parse = IDLParser::parse(Rule::schema, raw)?; + + let mut items: Vec = vec![]; + + for record in parse.into_iter() { + items.push(parse_inner(record).unwrap()); + } + + Ok(Unit::Items(items)) +} + +fn parse_inner(record: Pair) -> Result { + // let consts: Vec = vec![]; + + let inner = match record.as_rule() { + Rule::namespace => { + Ok(Unit::Namespace(record.into_inner().as_str().to_owned())) + } + Rule::constant => { + let pairs = record.into_inner(); + + let mut id: Option = None; + let mut kind: Option = None; + let mut default: Option> = None; + + for pair in pairs.flatten().collect::>>() { + match pair.as_rule() { + Rule::id => id = Some(pair.as_str().to_owned()), + Rule::kind => kind = Some(primitive::to_type(pair.as_str())), + Rule::value => { + let under = pair.into_inner().next().unwrap(); + + default = match under.as_rule() { + Rule::inner_string => Some(under.as_str().as_bytes().to_vec()), + Rule::inner_namespaced => Some(under.as_str().as_bytes().to_vec()), + _ => None + }; + } + Rule::inner_string | Rule::inner_namespaced => {} + _ => { unreachable!("Reached a unexpected rule that was possibly forgotten") } + } + } + + Ok( + Unit::Consts( + vec![ + Const { + id: id.ok_or("Id is not present").unwrap(), + type_: kind.ok_or("Type is not present").unwrap(), + default_value: default.unwrap() + } + ] + ) + ) + } + Rule::settings => { + let mut pairs = record.into_inner(); + + let id: String = pairs.next().unwrap().as_str().to_owned(); + let parameters: Vec = to_parameters(pairs); + + Ok(Unit::Settings( + vec![ + Settings { id, parameters } + ] + )) + } + Rule::enumeration => { + let mut pairs = record.into_inner(); + + // let mut index: Option = None; + let id: String = pairs.next().unwrap().as_str().to_owned(); + let variants: Vec = vec![]; + + Ok(Unit::Enums( + vec![ + Enum { id, variants } + ] + )) + } + Rule::enum_variant => { todo!() } + Rule::structure => { + let mut pairs = record.into_inner(); + + let id: String = pairs.next().unwrap().as_str().to_owned(); + let mut parameters: Vec = vec![]; + let mut fields: Vec = vec![]; + + for pair in pairs { + match pair.as_rule() { + Rule::parameter => parameters.push(to_parameter(pair.into_inner())), + Rule::field => fields.push(to_field(pair.into_inner())), + _ => unreachable!() + } + } + + Ok(Unit::Structs(vec![ + Struct { id, parameters, fields } + ])) + } + Rule::error => { + let mut pairs = record.into_inner(); + + let id: String = pairs.next().unwrap().as_str().to_owned(); + let mut parameters: Vec = vec![]; + let mut fields: Vec = vec![]; + + for pair in pairs { + match pair.as_rule() { + Rule::parameter => parameters.push(to_parameter(pair.into_inner())), + Rule::field => fields.push(to_field(pair.into_inner())), + _ => unreachable!() + } + } + + Ok(Unit::Errors(vec![ + Error { id, parameters, fields } + ])) + } + Rule::protocol => { + let mut pairs = record.into_inner(); + + let id: String = pairs.next().unwrap().as_str().to_owned(); + let mut parameters: Vec = vec![]; + let mut functions: Vec = vec![]; + + for pair in pairs { + match pair.as_rule() { + Rule::parameter => parameters.push(to_parameter(pair.into_inner())), + Rule::function => functions.push(to_function(pair.into_inner())), + _ => unreachable!() + } + } + + Ok(Unit::Protocols(vec![ + Protocol { + id, + parameters, + functions: vec![], + } + ])) + } + Rule::function => { todo!() } + Rule::argument => { todo!() } + Rule::returns => { todo!() } + Rule::throw => { todo!() } + Rule::COMMENT => { todo!() } + _ => unreachable!() + }; + + inner +} + + +fn to_parameters(mut pairs: Pairs) -> Vec { + let mut params = vec![]; + + while let Some(pair) = pairs.next() { + params.push(to_parameter(pair.into_inner())); + } + + params +} + +fn to_parameter(mut pairs: Pairs) -> Parameter { + Parameter { + id: pairs.next().unwrap().as_str().to_owned(), + value: pairs.next().unwrap().as_str().as_bytes().to_vec() + } +} + +fn to_field(pairs: Pairs) -> Field { + let mut index: u8 = 0; + let mut optional: bool = false; + let mut field_id: Option = None; + let mut field_kind: Option = None; + let mut field_value: Option> = None; + + for field_pair in pairs { + match field_pair.as_rule() { + Rule::index => index = field_pair.as_str().parse().unwrap(), + Rule::requirement => optional = true, + Rule::id => field_id = Some(field_pair.as_str().to_owned()), + Rule::kind => field_kind = Some(primitive::to_type(field_pair.as_str())), + Rule::value => field_value = Some(field_pair.as_str().as_bytes().to_vec()), + _ => println!("field bad {:?}", field_pair.as_rule()) + } + } + + Field { + id: field_id.ok_or("Id is not present").unwrap(), + index, optional, + type_: field_kind.unwrap(), + default_value: field_value.unwrap(), + } +} + +fn to_function(pairs: Pairs) -> Function { + let mut index: Option = None; + let mut async_: bool = false; + let mut direction = Direction::Both; + let mut id: Option = None; + let mut arguments: Vec = vec![]; + let parameters: Vec = vec![]; + let returns: Vec = vec![]; + let throws: Vec = vec![]; + + for pair in pairs { + match pair.as_rule() { + Rule::index => index = Some(pair.as_str().parse().unwrap()), + Rule::id => id = Some(pair.as_str().to_owned()), + Rule::direction => direction = match pair.as_str() { + "client" => Direction::Client, + "server" => Direction::Server, + dir => panic!("Direction {:#} does not exist", dir) + }, + Rule::asynchronous => async_ = true, + Rule::argument => { + arguments.push(to_argument(pair.into_inner())) + } + Rule::returns => {} + Rule::parameter => {} + Rule::throw => {} + _ => unreachable!() + } + } + + Function { + index: index.unwrap(), + id: id.unwrap(), + async_, + direction, + arguments, return_: returns, parameters, throws, + } +} + +fn to_argument(pairs: Pairs) -> Argument { + let mut id: Option = None; + let mut kind: Option = None; + + for pair in pairs { + match pair.as_rule() { + Rule::id => id = Some(pair.as_str().to_owned()), + Rule::kind => kind = Some(primitive::to_type(pair.as_str())), + _ => unreachable!() + } + } + + Argument { id, type_: kind.unwrap() } +} + diff --git a/src/ir.rs b/src/ir.rs new file mode 100644 index 0000000..2e9cfc8 --- /dev/null +++ b/src/ir.rs @@ -0,0 +1,6 @@ +// Relative Modules +mod sanitizer; +mod context; +mod serialization; +pub mod unit; +pub mod primitive; diff --git a/src/ir/context.rs b/src/ir/context.rs new file mode 100644 index 0000000..e060df1 --- /dev/null +++ b/src/ir/context.rs @@ -0,0 +1,24 @@ +// Standard Uses + +// Local Uses +use crate::ir::unit::Unit; +use crate::ir::serialization::Origin; + +// External Uses + + +pub struct Context { + pub units: Vec<(Origin, Unit)> +} + +#[allow(unused)] +impl Context { + fn add_unit(self, origin: Origin, unit: Unit) { + todo!() + } + + fn sanitize_units(self) { + + } +} + diff --git a/src/ir/primitive.rs b/src/ir/primitive.rs new file mode 100644 index 0000000..cfe44c8 --- /dev/null +++ b/src/ir/primitive.rs @@ -0,0 +1,96 @@ +// Standard Uses + +// Local Uses + +// External Uses + + +#[derive(Debug, Eq, PartialEq)] +#[repr(u8)] +pub enum Primitive { + U8(u8) = 0, + U16(u16), + U32(u32), + U64(u64), + U128(u128), + + S8(u8), + S16(u16), + S32(u32), + S64(u64), + S128(u128), + + // Float(f32), + // Double(f64), + + String(String), + Namespaced(String) +} + +#[derive(Debug, Eq, PartialEq)] +#[repr(u8)] +pub enum TypeValue { + U8 = 0, U16, U32, U64, U128, + S8, S16, S32, S64, S128, + // Float, Double, + String, + Namespaced +} + +fn to_primitive(type_: &str, value: &str) -> Primitive { + match type_ { + "u8" => Primitive::U8(value.parse().unwrap()), + "u16" => Primitive::U16(value.parse().unwrap()), + "u32" => Primitive::U32(value.parse().unwrap()), + "u64" => Primitive::U64(value.parse().unwrap()), + "u128" => Primitive::U128(value.parse().unwrap()), + + "s8" => Primitive::U8(value.parse().unwrap()), + "s16" => Primitive::U16(value.parse().unwrap()), + "s32" => Primitive::U32(value.parse().unwrap()), + "s64" => Primitive::U64(value.parse().unwrap()), + "s128" => Primitive::U128(value.parse().unwrap()), + + // TODO: Should multiple alias be present? »string« could be enough + "str" | "string" => Primitive::String(value.to_owned()), + _ => { panic!("Got unknown type '{type_}'") } + } +} + +pub fn to_type(type_: &str) -> TypeValue { + match type_ { + "u8" => TypeValue::U8{}, + "u16" => TypeValue::U16{}, + "u32" => TypeValue::U32{}, + "u64" => TypeValue::U64{}, + "u128" => TypeValue::U128{}, + + "s8" => TypeValue::S8{}, + "s16" => TypeValue::S16{}, + "s32" => TypeValue::S32{}, + "s64" => TypeValue::S64{}, + "s128" => TypeValue::S128{}, + + "str" => TypeValue::String{}, + + _ => TypeValue::Namespaced{} + } +} + +fn to_value(type_: &TypeValue, value: &str) -> Vec { + match type_ { + TypeValue::U8 => Vec::from([value.parse::().unwrap()]), + TypeValue::U16 => Vec::from([value.parse::().unwrap()]), + TypeValue::U32 => Vec::from([value.parse::().unwrap()]), + TypeValue::U64 => Vec::from([value.parse::().unwrap()]), + TypeValue::U128 => Vec::from([value.parse::().unwrap()]), + TypeValue::S8 => Vec::from([value.parse::().unwrap()]), + TypeValue::S16 => Vec::from([value.parse::().unwrap()]), + TypeValue::S32 => Vec::from([value.parse::().unwrap()]), + TypeValue::S64 => Vec::from([value.parse::().unwrap()]), + TypeValue::S128 => Vec::from([value.parse::().unwrap()]), + TypeValue::String => Vec::from([value.parse::().unwrap()]), + TypeValue::Namespaced => Vec::from([value.parse::().unwrap()]), + } +} + diff --git a/src/ir/sanitizer.rs b/src/ir/sanitizer.rs new file mode 100644 index 0000000..b6f0a4b --- /dev/null +++ b/src/ir/sanitizer.rs @@ -0,0 +1,14 @@ +// Standard Uses + +// Local Uses +use crate::ir::context::Context; + +// External Uses + + +#[allow(unused)] +fn sanitize_context_units(context: &Context) { + for (_, unit) in &context.units { + + } +} diff --git a/src/ir/serialization.rs b/src/ir/serialization.rs new file mode 100644 index 0000000..8eaa988 --- /dev/null +++ b/src/ir/serialization.rs @@ -0,0 +1,13 @@ +// Relative Modules +mod messagepack; + +// Standard Uses + +// Local Uses + +// External Uses + + +#[allow(unused)] +pub struct Origin {} + diff --git a/src/ir/serialization/messagepack.rs b/src/ir/serialization/messagepack.rs new file mode 100644 index 0000000..080aa0f --- /dev/null +++ b/src/ir/serialization/messagepack.rs @@ -0,0 +1,20 @@ +// Standard Uses + +// Local Uses +use crate::ir::unit::Unit; + +// External Uses +#[allow(unused)] +use rmp; + + +// https://docs.rs/rmp/latest/rmp/ +#[allow(unused)] +fn from_bytes(raw: Vec) -> Unit { + todo!() +} + +#[allow(unused)] +fn to_bytes(unit: Unit) -> Vec { + todo!() +} diff --git a/src/ir/unit.rs b/src/ir/unit.rs new file mode 100644 index 0000000..262bc10 --- /dev/null +++ b/src/ir/unit.rs @@ -0,0 +1,136 @@ +// Standard Uses + +// Local Uses +use crate::ir::primitive::{Primitive, TypeValue}; + +// External Uses + + +/// Intermediate Representation Unit +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub enum Unit { + Items(Vec), + Tag(String), + Namespace(String), + Imports(String), + Settings(Vec), + Consts(Vec), + Structs(Vec), + Enums(Vec), + Errors(Vec), + Protocols(Vec), +} + + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub enum Type { + Primitive(Primitive), + Union, + Namespaced +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub enum DefaultValue { + Any +} + +#[derive(Debug, Eq, PartialEq)] +pub struct Settings { + pub id: String, + pub parameters: Vec, +} + +#[derive(Debug, Eq, PartialEq)] +pub struct Const { + pub id: String, + pub type_: TypeValue, + pub default_value: Vec +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Struct { + pub id: String, + pub parameters: Vec, + pub fields: Vec, +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Enum { + pub id: String, + pub variants: Vec +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct EnumVariant { + pub id: String, + pub type_: Option +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Error { + pub id: String, + pub parameters: Vec, + pub fields: Vec, +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Parameter { + pub id: String, + pub value: Vec +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Field { + pub index: u8, + pub optional: bool, + pub id: String, + pub type_: TypeValue, + pub default_value: Vec, +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Protocol { + pub id: String, + pub parameters: Vec, + pub functions: Vec +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub enum Direction { Client, Server, Both } + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Function { + pub index: u8, + pub id: String, + pub async_: bool, + pub direction: Direction, + pub arguments: Vec, + pub return_: Vec, + pub parameters: Vec, + pub throws: Vec +} + +#[allow(unused)] +#[derive(Debug, Eq, PartialEq)] +pub struct Argument { + pub id: Option, + pub type_: TypeValue +} + +#[allow(unused)] +pub fn from_binary(data: Vec) -> Unit { + todo!() +} + diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..3806f59 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,9 @@ +// Extern +extern crate pest; +#[macro_use] +extern crate pest_derive; + +// Relative Modules +pub mod ir; +pub mod codegen; +pub mod idl; diff --git a/tests/idl/mod.rs b/tests/idl/mod.rs new file mode 100644 index 0000000..04f26dc --- /dev/null +++ b/tests/idl/mod.rs @@ -0,0 +1 @@ +mod pest; diff --git a/tests/idl/pest.rs b/tests/idl/pest.rs new file mode 100644 index 0000000..63336da --- /dev/null +++ b/tests/idl/pest.rs @@ -0,0 +1,23 @@ +// Standard Uses + +// Local Uses + +// External Uses +use comline_rs::idl; +use comline_rs::ir::unit::Unit; + + +#[test] +fn from_raw_to_unit() { + let raw = std::fs::read_to_string("tests/idl/simple.cls").unwrap(); + let unit = idl::pest::parse_into_unit(raw.as_str()).unwrap(); + + assert_eq!( + unit, Unit::Items(vec![ + Unit::Namespace("".to_string()), + + ] + ) + ) +} + diff --git a/tests/idl/simple.cls b/tests/idl/simple.cls new file mode 100644 index 0000000..2488c95 --- /dev/null +++ b/tests/idl/simple.cls @@ -0,0 +1,22 @@ +namespace tests.idl.simple + +const DEFAULT_NAME: str = "flower" + +settings Test { + forbid_optional_indexing=True +} + +struct Message { + 1# name: str = DEFAULT_NAME + 2# optional recipient: str[validators=StringBounds(min_chars=3 max_chars=12)] = "bee" +} + +error RecipientNotFoundError { + message = "Recipient with name {self.recipient} not found" + 1# recipient: str[validators=StringBounds(min_chars=8 max_chars=16)] +} + +protocol Mail provider=Both { + 1# function send_message(message: Message) -> str ! NotFoundError[function.message.recipient] + : timeout_ms=1000 +} diff --git a/tests/mod.rs b/tests/mod.rs new file mode 100644 index 0000000..7135a1f --- /dev/null +++ b/tests/mod.rs @@ -0,0 +1,2 @@ +mod idl; +mod units; \ No newline at end of file diff --git a/tests/units/consts.cls b/tests/units/consts.cls new file mode 100644 index 0000000..fe0fcb3 --- /dev/null +++ b/tests/units/consts.cls @@ -0,0 +1,2 @@ +const VERSION: u8 = 1 + diff --git a/tests/units/dev.cls b/tests/units/dev.cls new file mode 100644 index 0000000..5152589 --- /dev/null +++ b/tests/units/dev.cls @@ -0,0 +1,27 @@ +namespace example + +const PROTOCOL: u8 = 0 +const SECRET: u8 = 1 + +enum Motion { + 1 # Wave + 2 # MoveArm +} + +struct Hello { + const SHAKE: u8 = 20 + + 1 # name: u8 +} + +struct Goodbye versioned=false { + wave: bool = false +} + +protocol Greet { + function smile + function wave () + function wave_wait () -> u8 + function wave_and_go () -> str: timeout_ms=100 + function wave_with (motion: Motion) +} diff --git a/tests/units/mod.rs b/tests/units/mod.rs new file mode 100644 index 0000000..9c294a0 --- /dev/null +++ b/tests/units/mod.rs @@ -0,0 +1,28 @@ +// Standard Uses +use std::string::ToString; + +// Local Uses + +// External Uses +use once_cell::sync::Lazy; +use comline_rs::ir::unit::{Const, Unit}; +use comline_rs::ir::primitive::TypeValue; + + +// Unit with a namespace and a constant +#[allow(unused)] +static UNIT_NAMESPACE_CONST_1: Lazy = Lazy::new( || { + Unit::Items( + vec![ + Unit::Namespace("units.test".to_string()), + Unit::Consts(vec![ + Const { + id: "".to_string(), + type_: TypeValue::U8, + default_value: vec![], + } + ]) + ] + ) +}); + diff --git a/tests/units/protocol/args.cls b/tests/units/protocol/args.cls new file mode 100644 index 0000000..ff4af56 --- /dev/null +++ b/tests/units/protocol/args.cls @@ -0,0 +1,12 @@ +namespace units.protocols_args + +protocol Proposals { + function call(Args) + function call(kind: u8, name: str, message: str) +} + +struct Args { + kind: u8 + name: str + message: str +} diff --git a/tests/units/protocol/directions.cls b/tests/units/protocol/directions.cls new file mode 100644 index 0000000..e69de29 diff --git a/tests/units/protocol/scalars.cls b/tests/units/protocol/scalars.cls new file mode 100644 index 0000000..e69de29