diff --git a/Cargo.lock b/Cargo.lock index a3ec426c..7869aa86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,9 +39,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "clap" -version = "3.1.14" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535434c063ced786eb04aaf529308092c5ab60889e8fe24275d15de07b01fa97" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.7" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" dependencies = [ "heck", "proc-macro-error", @@ -86,6 +86,10 @@ dependencies = [ "memchr", ] +[[package]] +name = "flat" +version = "0.0.0" + [[package]] name = "hashbrown" version = "0.11.2" @@ -131,9 +135,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "memchr" @@ -143,21 +147,18 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "neptune" -version = "0.1.0" +version = "0.0.0" dependencies = [ "anyhow", "clap", - "combine", - "hex", - "strum", - "strum_macros", + "uplc", ] [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" [[package]] name = "proc-macro-error" @@ -185,11 +186,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -234,13 +235,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -259,10 +260,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-ident" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + +[[package]] +name = "uplc" +version = "0.1.0" +dependencies = [ + "anyhow", + "combine", + "flat", + "hex", + "strum", + "strum_macros", +] [[package]] name = "version_check" diff --git a/Cargo.toml b/Cargo.toml index b951c6c2..f409c5ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,2 @@ -[package] -name = "neptune" -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.57" -clap = { version = "3.1.14", features = ["derive"] } -combine = "4.6.4" -hex = "0.4.3" -strum = "0.24.0" -strum_macros = "0.24.0" +[workspace] +members = ["crates/cli", "crates/flat", "crates/uplc"] diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml new file mode 100644 index 00000000..996ced22 --- /dev/null +++ b/crates/cli/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "neptune" +version = "0.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.57" +clap = { version = "3.1.14", features = ["derive"] } +uplc = { path = '../uplc' } diff --git a/src/cli.rs b/crates/cli/src/lib.rs similarity index 100% rename from src/cli.rs rename to crates/cli/src/lib.rs diff --git a/src/main.rs b/crates/cli/src/main.rs similarity index 82% rename from src/main.rs rename to crates/cli/src/main.rs index b3282e4d..e490bccc 100644 --- a/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,5 +1,6 @@ -use neptune::cli::Cli; -use neptune::parser; +use uplc::parser; + +use neptune::Cli; fn main() -> anyhow::Result<()> { let args = Cli::default(); diff --git a/crates/flat/Cargo.toml b/crates/flat/Cargo.toml new file mode 100644 index 00000000..e69e2d8a --- /dev/null +++ b/crates/flat/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "flat" +version = "0.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] \ No newline at end of file diff --git a/crates/flat/src/encode.rs b/crates/flat/src/encode.rs new file mode 100644 index 00000000..22935cfe --- /dev/null +++ b/crates/flat/src/encode.rs @@ -0,0 +1,34 @@ +use crate::{encoder::Encoder, filler::Filler}; + +pub trait Encode { + fn encode(&self, e: &mut Encoder) -> Result<(), String>; +} + +impl Encode for bool { + fn encode(&self, e: &mut Encoder) -> Result<(), String> { + e.bool(*self); + + Ok(()) + } +} + +impl Encode for (T, K) +where + T: Encode, + K: Encode, +{ + fn encode(&self, e: &mut Encoder) -> Result<(), String> { + self.0.encode(e)?; + self.1.encode(e)?; + + Ok(()) + } +} + +impl Encode for Filler { + fn encode(&self, e: &mut Encoder) -> Result<(), String> { + e.filler(); + + Ok(()) + } +} diff --git a/src/flat.rs b/crates/flat/src/encoder.rs similarity index 53% rename from src/flat.rs rename to crates/flat/src/encoder.rs index 15b7730d..4ac01dee 100644 --- a/src/flat.rs +++ b/crates/flat/src/encoder.rs @@ -1,49 +1,4 @@ -pub trait Encode { - fn encode(&self, e: &mut Encoder) -> Result<(), String>; -} - -impl Encode for bool { - fn encode(&self, e: &mut Encoder) -> Result<(), String> { - e.bool(*self); - - Ok(()) - } -} - -enum Filler { - FillerStart(Box), - FillerEnd, -} - -impl Filler { - pub fn len(&self) -> usize { - match self { - Filler::FillerStart(f) => f.len() + 1, - Filler::FillerEnd => 1, - } - } -} - -impl Encode for Filler { - fn encode(&self, e: &mut Encoder) -> Result<(), String> { - e.filler(); - - Ok(()) - } -} - -impl Encode for (T, K) -where - T: Encode, - K: Encode, -{ - fn encode(&self, e: &mut Encoder) -> Result<(), String> { - self.0.encode(e)?; - self.1.encode(e)?; - - Ok(()) - } -} +use crate::encode::Encode; pub struct Encoder { pub buffer: Vec, @@ -116,33 +71,8 @@ impl Encoder { self.used_bits = 0; } - fn filler(&mut self) { + pub(crate) fn filler(&mut self) { self.current_byte |= 1; self.next_word(); } } - -pub fn encode(value: T) -> Result, String> -where - T: Encode, -{ - let mut e = Encoder::new(); - - e.encode((value, Filler::FillerEnd))?; - - Ok(e.buffer) -} - -#[cfg(test)] -mod test { - #[test] - fn encode_bool() { - let bytes = super::encode(true).unwrap(); - - assert_eq!(bytes, vec![0b10000001]); - - let bytes = super::encode(false).unwrap(); - - assert_eq!(bytes, vec![0b00000001]); - } -} diff --git a/crates/flat/src/filler.rs b/crates/flat/src/filler.rs new file mode 100644 index 00000000..162211b0 --- /dev/null +++ b/crates/flat/src/filler.rs @@ -0,0 +1,13 @@ +pub enum Filler { + FillerStart(Box), + FillerEnd, +} + +impl Filler { + pub fn len(&self) -> usize { + match self { + Filler::FillerStart(f) => f.len() + 1, + Filler::FillerEnd => 1, + } + } +} diff --git a/crates/flat/src/lib.rs b/crates/flat/src/lib.rs new file mode 100644 index 00000000..1c0c1334 --- /dev/null +++ b/crates/flat/src/lib.rs @@ -0,0 +1,33 @@ +mod encode; +mod encoder; +mod filler; + +pub mod en { + pub use super::encode::*; + pub use super::encoder::*; +} + +pub fn encode(value: T) -> Result, String> +where + T: en::Encode, +{ + let mut e = en::Encoder::new(); + + e.encode((value, filler::Filler::FillerEnd))?; + + Ok(e.buffer) +} + +#[cfg(test)] +mod test { + #[test] + fn encode_bool() { + let bytes = super::encode(true).unwrap(); + + assert_eq!(bytes, vec![0b10000001]); + + let bytes = super::encode(false).unwrap(); + + assert_eq!(bytes, vec![0b00000001]); + } +} diff --git a/crates/uplc/Cargo.toml b/crates/uplc/Cargo.toml new file mode 100644 index 00000000..6df70bf4 --- /dev/null +++ b/crates/uplc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "uplc" +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.57" +combine = "4.6.4" +flat = { path = "../flat" } +hex = "0.4.3" +strum = "0.24.0" +strum_macros = "0.24.0" diff --git a/crates/uplc/example/plutus-core b/crates/uplc/example/plutus-core new file mode 100644 index 00000000..e91bf68f --- /dev/null +++ b/crates/uplc/example/plutus-core @@ -0,0 +1,3 @@ +(program 1.0.0 + [[(builtin addInteger) (con integer 4)] (con integer 8)] +) \ No newline at end of file diff --git a/src/ast.rs b/crates/uplc/src/ast.rs similarity index 100% rename from src/ast.rs rename to crates/uplc/src/ast.rs diff --git a/src/builtins.rs b/crates/uplc/src/builtins.rs similarity index 100% rename from src/builtins.rs rename to crates/uplc/src/builtins.rs diff --git a/src/lib.rs b/crates/uplc/src/lib.rs similarity index 75% rename from src/lib.rs rename to crates/uplc/src/lib.rs index d912086e..54249879 100644 --- a/src/lib.rs +++ b/crates/uplc/src/lib.rs @@ -1,7 +1,5 @@ pub mod ast; pub mod builtins; -pub mod cli; -pub mod flat; pub mod parser; #[macro_use] diff --git a/src/parser.rs b/crates/uplc/src/parser.rs similarity index 100% rename from src/parser.rs rename to crates/uplc/src/parser.rs diff --git a/example/plutus-core b/example/plutus-core deleted file mode 100644 index 2765bdb2..00000000 --- a/example/plutus-core +++ /dev/null @@ -1,3 +0,0 @@ -(program 1.0.0 - [(builtin sha2_256) (con bytestring #54686543616B654973414C6965)] -) \ No newline at end of file