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
[[package]]
name = "dalet"
version = "1.0.0-pre2"
name = "bitvec"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]]
name = "dalet"
version = "1.0.0-pre4"
dependencies = [
"bitvec",
"num_enum",
"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]]
@ -27,6 +106,12 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "serde"
version = "1.0.204"
@ -47,6 +132,17 @@ dependencies = [
"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]]
name = "syn"
version = "2.0.72"
@ -58,8 +154,49 @@ dependencies = [
"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]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]
name = "dalet"
version = "1.0.0-pre3"
version = "1.0.0-pre4"
edition = "2021"
authors = ["artegoser"]
license = "MIT"
@ -12,7 +12,10 @@ keywords = ["dalet"]
categories = ["compression", "compilers", "encoding"]
[dependencies]
bitvec = "1.0.1"
num_enum = "0.7.3"
serde = { version = "1.0", features = ["derive"] }
serde_repr = "0.1"
[features]
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")]
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() {
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!");
}

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
- **Null**
- **Integer**
- **Integer** (2)
- **String** (5)
- **Tag array**
- **Tags** (4)
@ -22,7 +21,7 @@ Mime type: `application/dalet-pack`
## 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)
- string must be encoded in UTF-8
- 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 |
| ------------------------ | --- | ------- |
| null | 0 | 0000 |
| int | 1 | 0001 |
| int 4 | 0 | 0000 |
| int 8 | 1 | 0001 |
| str 3 | 2 | 0010 |
| str 4 | 3 | 0011 |
| str 8 | 4 | 0100 |
@ -64,22 +63,20 @@ variable number of objects stored in DaletPack format:
+~~~~~~~~~~~~~~~~~+
| |
+~~~~~~~~~~~~~~~~~+
```
### Null format
```txt
+--------+
| 0000 |
+--------+
X - unknown bit
```
### Integer format
```txt
+--------+------+
| 0001 | XXXX |
| 0000 | XXXX |
+--------+------+
+--------+----------+
| 0001 | XXXXXXXX |
+--------+----------+
```
### String format
@ -88,7 +85,7 @@ variable number of objects stored in DaletPack format:
str 3 (up to 8 bytes):
+--------+-----+=========+
| 0010 | XXX | utf-8 |
+--------+-----+========+
+--------+-----+=========+
str 4 (up to 16 bytes):
+--------+------+=========+

View file

@ -118,14 +118,14 @@ ol: {
## 6. Row
| Property | Description |
| -------- | ---------------------- |
| -------- | ---------------------------- |
| name | row |
| id | 6 |
| body | tags |
| argument | (optional); start, 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.
| 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 start.
m
**Daleth example**:
```txt
@ -151,7 +151,7 @@ end -> 1
| -------- | ----------- |
| name | link |
| id | 7 |
| body | text, tags |
| body | any |
| argument | string |
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 |
| id | 8 |
| body | text, tags |
| body | any |
| argument | string |
Link to the same site. On click the link opens in current tab.
@ -185,7 +185,7 @@ navlink[/specification]: I am Navlink
| -------- | ----------- |
| name | btn |
| id | 9 |
| body | text,tags |
| body | any |
| argument | string |
Same as link, but with button style.
@ -202,7 +202,7 @@ btn[https://example.com]: I am Button
| -------- | ----------- |
| name | navbtn |
| id | 9 |
| body | text,tags |
| body | any |
| argument | string |
Same as navlink, but with button style.
@ -480,11 +480,11 @@ disc[Click to expand]: I am Disclosure
## 26. Block
| Property | Description |
| -------- | ----------- |
| -------- | ----------------------------- |
| name | bl |
| id | 26 |
| body | text, tags |
| argument | start, end |
| argument | optional; start, center, end |
Creates block element. Can be used for aligning. By default aligned to center.