feat: rust create abstractions, tag enum, fix serde; update daletpack, daletl specs

This commit is contained in:
Artemy Egorov 2024-08-01 15:51:59 +03:00
parent d5ba86f251
commit 1611820661
9 changed files with 355 additions and 93 deletions

141
libs/rust/Cargo.lock generated
View file

@ -3,10 +3,89 @@
version = 3 version = 3
[[package]] [[package]]
name = "dalet" name = "bitvec"
version = "1.0.0-pre2" version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [ dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]]
name = "dalet"
version = "1.0.0-pre4"
dependencies = [
"bitvec",
"num_enum",
"serde", "serde",
"serde_repr",
]
[[package]]
name = "equivalent"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "funty"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "indexmap"
version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
"hashbrown",
]
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "num_enum"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
dependencies = [
"num_enum_derive",
]
[[package]]
name = "num_enum_derive"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "proc-macro-crate"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
dependencies = [
"toml_edit",
] ]
[[package]] [[package]]
@ -27,6 +106,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.204" version = "1.0.204"
@ -47,6 +132,17 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "serde_repr"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.72" version = "2.0.72"
@ -58,8 +154,49 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "tap"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "toml_datetime"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
[[package]]
name = "toml_edit"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [
"indexmap",
"toml_datetime",
"winnow",
]
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.12" version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "winnow"
version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
[[package]]
name = "wyz"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
"tap",
]

View file

@ -1,6 +1,6 @@
[package] [package]
name = "dalet" name = "dalet"
version = "1.0.0-pre3" version = "1.0.0-pre4"
edition = "2021" edition = "2021"
authors = ["artegoser"] authors = ["artegoser"]
license = "MIT" license = "MIT"
@ -12,7 +12,10 @@ keywords = ["dalet"]
categories = ["compression", "compilers", "encoding"] categories = ["compression", "compilers", "encoding"]
[dependencies] [dependencies]
bitvec = "1.0.1"
num_enum = "0.7.3"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_repr = "0.1"
[features] [features]
default = ["types"] default = ["types"]

View file

@ -0,0 +1,106 @@
use num_enum::TryFromPrimitive;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Tag {
El(NotNullBody),
H(String, HeadingArgument),
P(NotNullBody),
Br,
Ul(Vec<Tag>),
Ol(Vec<Tag>),
Row(Vec<Tag>, AlignArgument),
Link(Body, String),
Navlink(Body, String),
Btn(Body, String),
NavBtn(Body, String),
Img(String),
Table(Vec<Tag>),
Tcol(Vec<Tag>),
Tpcol(Vec<Tag>),
Hr,
B(String),
I(String),
Bq(NotNullBody),
Footlnk(StringOrNumberArgument),
Footn(String, StringOrNumberArgument),
A(StringOrNumberArgument),
S(String),
Sup(String),
Sub(String),
Disc(NotNullBody),
Bl(NotNullBody, AlignArgument),
Carousel(Vec<Tag>),
}
#[derive(Debug, Clone, PartialEq, Eq, TryFromPrimitive)]
#[repr(u8)]
pub enum HeadingArgument {
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
}
#[derive(Debug, Clone, PartialEq, Eq, TryFromPrimitive)]
#[repr(u8)]
pub enum AlignArgument {
Start,
Center,
End,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StringOrNumberArgument {
String(String),
Number(u8),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Body {
Text(String),
Tags(Vec<Tag>),
Null,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Argument {
Text(String),
Number(i8),
Null,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NotNullArgument {
Text(String),
Number(i8),
}
impl NotNullArgument {
pub fn to_argument(self) -> Argument {
match self {
NotNullArgument::Number(v) => Argument::Number(v),
NotNullArgument::Text(v) => Argument::Text(v),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NotNullBody {
Text(String),
Tags(Vec<Tag>),
}
impl NotNullBody {
pub fn to_body(self) -> Body {
match self {
NotNullBody::Text(v) => Body::Text(v),
NotNullBody::Tags(v) => Body::Tags(v),
}
}
}

68
libs/rust/src/daletl.rs Normal file
View file

@ -0,0 +1,68 @@
use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use num_enum::TryFromPrimitive;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Tag {
id: Tid,
body: Body,
argument: Argument,
}
impl Tag {
#[inline]
pub fn new(id: Tid, body: Body, argument: Argument) -> Tag {
Tag { id, body, argument }
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(untagged)]
pub enum Body {
Text(String),
Tags(Vec<Tag>),
Null,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(untagged)]
pub enum Argument {
Text(String),
Number(i8),
Null,
}
#[derive(Serialize_repr, Deserialize_repr, Debug, Clone, PartialEq, Eq, TryFromPrimitive)]
#[repr(u8)]
/// Tag Id
pub enum Tid {
El,
H,
P,
Br,
Ul,
Ol,
Row,
Link,
Navlink,
Btn,
Navbtn,
Img,
Table,
Tcol,
Tpcol,
Hr,
B,
I,
Bq,
Footlnk,
Footn,
A,
S,
Sup,
Sub,
Disc,
Bl,
Carousel,
}

View file

@ -1,4 +1,5 @@
mod types; #[cfg(feature = "types")]
pub mod daletl;
#[cfg(feature = "types")] #[cfg(feature = "types")]
pub use types::*; pub mod abstractions;

View file

@ -1,6 +1,10 @@
use dalet::{Argument, Body, Tag}; use dalet::daletl::{Argument, Body, Tag, Tid};
fn main() { fn main() {
let _ = Tag::new(1, Body::Text("I am Heading".to_string()), Argument::Null); let _ = Tag::new(
Tid::H,
Body::Text("I am Heading".to_string()),
Argument::Null,
);
println!("Hello, world!"); println!("Hello, world!");
} }

View file

@ -1,54 +0,0 @@
use serde::Serialize;
#[derive(Serialize, Debug, Clone)]
pub struct Tag {
id: i8,
body: Body,
argument: Argument,
}
impl Tag {
pub fn new(id: i8, body: Body, argument: Argument) -> Tag {
Tag { id, body, argument }
}
}
#[derive(Debug, Clone)]
pub enum Body {
Text(String),
Tags(Vec<Tag>),
Null,
}
impl Serialize for Body {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match *self {
Body::Text(ref text) => serializer.serialize_str(text),
Body::Tags(ref tag) => tag.serialize(serializer),
Body::Null => serializer.serialize_none(),
}
}
}
#[derive(Debug, Clone)]
pub enum Argument {
Text(String),
Number(i8),
Null,
}
impl Serialize for Argument {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match *self {
Argument::Text(ref text) => serializer.serialize_str(text),
Argument::Number(number) => serializer.serialize_i8(number),
Argument::Null => serializer.serialize_none(),
}
}
}

View file

@ -10,8 +10,7 @@ Mime type: `application/dalet-pack`
## Types ## Types
- **Null** - **Integer** (2)
- **Integer**
- **String** (5) - **String** (5)
- **Tag array** - **Tag array**
- **Tags** (4) - **Tags** (4)
@ -22,7 +21,7 @@ Mime type: `application/dalet-pack`
## Limitations ## Limitations
- a value of integer (4 bits) must be between 0 and 15 - a value of integer must be between 0 and 255
- maximum byte size of a String object is (2^32) - maximum byte size of a String object is (2^32)
- string must be encoded in UTF-8 - string must be encoded in UTF-8
- maximum number of elements of a tag array object is (2^32) - maximum number of elements of a tag array object is (2^32)
@ -33,8 +32,8 @@ Mime type: `application/dalet-pack`
| name | id | id-bits | | name | id | id-bits |
| ------------------------ | --- | ------- | | ------------------------ | --- | ------- |
| null | 0 | 0000 | | int 4 | 0 | 0000 |
| int | 1 | 0001 | | int 8 | 1 | 0001 |
| str 3 | 2 | 0010 | | str 3 | 2 | 0010 |
| str 4 | 3 | 0011 | | str 4 | 3 | 0011 |
| str 8 | 4 | 0100 | | str 8 | 4 | 0100 |
@ -64,22 +63,20 @@ variable number of objects stored in DaletPack format:
+~~~~~~~~~~~~~~~~~+ +~~~~~~~~~~~~~~~~~+
| | | |
+~~~~~~~~~~~~~~~~~+ +~~~~~~~~~~~~~~~~~+
```
### Null format X - unknown bit
```txt
+--------+
| 0000 |
+--------+
``` ```
### Integer format ### Integer format
```txt ```txt
+--------+------+ +--------+------+
| 0001 | XXXX | | 0000 | XXXX |
+--------+------+ +--------+------+
+--------+----------+
| 0001 | XXXXXXXX |
+--------+----------+
``` ```
### String format ### String format
@ -88,7 +85,7 @@ variable number of objects stored in DaletPack format:
str 3 (up to 8 bytes): str 3 (up to 8 bytes):
+--------+-----+=========+ +--------+-----+=========+
| 0010 | XXX | utf-8 | | 0010 | XXX | utf-8 |
+--------+-----+========+ +--------+-----+=========+
str 4 (up to 16 bytes): str 4 (up to 16 bytes):
+--------+------+=========+ +--------+------+=========+

View file

@ -117,15 +117,15 @@ ol: {
## 6. Row ## 6. Row
| Property | Description | | Property | Description |
| -------- | ---------------------- | | -------- | ---------------------------- |
| name | row | | name | row |
| id | 6 | | id | 6 |
| body | tags | | body | tags |
| argument | (optional); start, end | | argument | optional; start, center, end |
Splits the text into rows. The alignment argument specifies how the items inside the row are aligned. By default it is aligned to the center.
Splits the text into rows. The alignment argument specifies how the items inside the row are aligned. By default it is aligned to the start.
m
**Daleth example**: **Daleth example**:
```txt ```txt
@ -151,7 +151,7 @@ end -> 1
| -------- | ----------- | | -------- | ----------- |
| name | link | | name | link |
| id | 7 | | id | 7 |
| body | text, tags | | body | any |
| argument | string | | argument | string |
Link to other sites. On click the link opens in new tab. Link to other sites. On click the link opens in new tab.
@ -168,7 +168,7 @@ link[https://example.com]: I am Link
| -------- | ----------- | | -------- | ----------- |
| name | navlink | | name | navlink |
| id | 8 | | id | 8 |
| body | text, tags | | body | any |
| argument | string | | argument | string |
Link to the same site. On click the link opens in current tab. Link to the same site. On click the link opens in current tab.
@ -185,7 +185,7 @@ navlink[/specification]: I am Navlink
| -------- | ----------- | | -------- | ----------- |
| name | btn | | name | btn |
| id | 9 | | id | 9 |
| body | text,tags | | body | any |
| argument | string | | argument | string |
Same as link, but with button style. Same as link, but with button style.
@ -202,7 +202,7 @@ btn[https://example.com]: I am Button
| -------- | ----------- | | -------- | ----------- |
| name | navbtn | | name | navbtn |
| id | 9 | | id | 9 |
| body | text,tags | | body | any |
| argument | string | | argument | string |
Same as navlink, but with button style. Same as navlink, but with button style.
@ -479,12 +479,12 @@ disc[Click to expand]: I am Disclosure
## 26. Block ## 26. Block
| Property | Description | | Property | Description |
| -------- | ----------- | | -------- | ----------------------------- |
| name | bl | | name | bl |
| id | 26 | | id | 26 |
| body | text, tags | | body | text, tags |
| argument | start, end | | argument | optional; start, center, end |
Creates block element. Can be used for aligning. By default aligned to center. Creates block element. Can be used for aligning. By default aligned to center.