diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Cargo.lock | 65 | ||||
| -rw-r--r-- | Cargo.toml | 7 | ||||
| -rw-r--r-- | Makefile | 36 | ||||
| -rw-r--r-- | src/field/data.rs | 24 | ||||
| -rw-r--r-- | src/field/mod.rs | 21 | ||||
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/transaction/mod.rs | 19 |
8 files changed, 177 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f9087f8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,65 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "linea_caliente" +version = "0.1.0" +dependencies = [ + "thiserror", +] + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..41d67e8 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "linea_caliente" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "2.0.11" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..64bc1c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +profile := dev +target = $(shell rustc -vV | grep host | awk '{print $$2}') +app_name := page + +default: build + +set_rust: + rustup default stable + +prepare: + rustup target add $(target) + +build: prepare + cargo build --profile $(profile) --target $(target) + +test: + cargo test + +coverage: + cargo tarpaulin + +format: + cargo fmt && cargo clippy --fix + +lint: + cargo fmt -- --check && cargo clippy + +release: + cargo publish + +ci: lint coverage +ifneq (,$(findstring refs/tags/,$(GIT_REF))) + $(MAKE) release +endif + +.PHONY: default set_rust prepare build test coverage format lint release ci diff --git a/src/field/data.rs b/src/field/data.rs new file mode 100644 index 0000000..cd1341c --- /dev/null +++ b/src/field/data.rs @@ -0,0 +1,24 @@ +use super::Field; +use std::io::Result; + +pub struct Data { + value: Vec<u8>, +} + +impl Field for Data { + const ID: u16 = 101; + + fn size(&self) -> [u8; 2] { + (self.value.len() as u16).to_be_bytes() + } + + fn serialize_data(&self) -> &Vec<u8> { + &self.value + } + + fn deserialize(data: &[u8]) -> Result<Self> { + Ok(Data { + value: data.to_owned(), + }) + } +} diff --git a/src/field/mod.rs b/src/field/mod.rs new file mode 100644 index 0000000..82e8abd --- /dev/null +++ b/src/field/mod.rs @@ -0,0 +1,21 @@ +use std::io::Result; +mod data; + +pub use data::Data; + +pub trait Field: Sized { + const ID: u16; + + fn size(&self) -> [u8; 2]; + fn serialize_data(&self) -> &Vec<u8>; + fn deserialize(data: &[u8]) -> Result<Self>; + fn serialize(&self) -> Vec<u8> { + let mut result = Vec::new(); + + result.extend_from_slice(&Self::ID.to_be_bytes()); + result.extend_from_slice(&self.size()); + result.extend_from_slice(self.serialize_data()); + + result + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..397cbd2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +//! `linea_caliente` implements the hotline protocol to help build servers and +//! clients around it. +pub mod field; +pub mod transaction; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs new file mode 100644 index 0000000..b1cc12a --- /dev/null +++ b/src/transaction/mod.rs @@ -0,0 +1,19 @@ +use crate::field::Data; + +pub enum Request { + GetMessages, + NewMessage { data: Data }, + OldPostNews { data: Data }, + ServerMessage, +} + +impl Request { + pub fn get_type(&self) -> u8 { + match self { + Request::GetMessages => 101, + Request::NewMessage { data: _ } => 102, + Request::OldPostNews { data: _ } => 103, + Request::ServerMessage => 104, + } + } +} |