-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Eval EXEC <execvy@gmail.com>
- Loading branch information
Showing
11 changed files
with
292 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// Unsigned integers | ||
array uint64 [byte; 8]; | ||
array uint32 [byte; 4]; | ||
array uint16 [byte; 2]; | ||
array uint8 [byte; 1]; | ||
|
||
// Signed integers | ||
array int64 [byte; 8]; | ||
array int32 [byte; 4]; | ||
array int16 [byte; 2]; | ||
array int8 [byte; 1]; | ||
|
||
// Bool | ||
array bool [byte; 1]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
target/ | ||
Cargo.lock |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
[package] | ||
name = "molecule-std" | ||
version = "0.0.1" | ||
authors = ["Nervos Core Dev <dev@nervos.org>"] | ||
edition = "2018" | ||
description = "std primitive types for molecule." | ||
homepage = "https://github.com/nervosnetwork/molecule" | ||
repository = "https://github.com/nervosnetwork/molecule" | ||
keywords = ["molecule", "code-generation", "serialization"] | ||
categories = [ | ||
"parser-implementations", | ||
"development-tools::build-utils", | ||
"encoding", | ||
"data-structures" | ||
] | ||
license = "MIT" | ||
|
||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||
|
||
[dependencies] | ||
molecule = { path = "../../bindings/rust" } | ||
|
||
[features] | ||
default = [] | ||
with-primitive-types = [] | ||
|
||
[build-dependencies] | ||
codegen = { package ="molecule-codegen", path = "../../tools/codegen" , features = ["gen-primitive-types"]} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
use codegen::{Compiler, Language}; | ||
|
||
fn compile_schema(schema: &str) { | ||
let mut compiler = Compiler::new(); | ||
compiler | ||
.input_schema_file(schema) | ||
.generate_code(Language::Rust) | ||
.output_dir_set_default() | ||
.run() | ||
.unwrap(); | ||
println!("cargo:rerun-if-changed={}", schema); | ||
} | ||
|
||
fn main() { | ||
println!("cargo:rerun-if-changed=../primitive_types.mol"); | ||
compile_schema("../primitive_types.mol"); | ||
let out_dir = ::std::env::var("OUT_DIR").unwrap(); | ||
println!("{}", out_dir); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
pub mod pack; | ||
|
||
pub mod io { | ||
pub use molecule::io::{self, *}; | ||
} | ||
pub mod error { | ||
pub use molecule::error::{self, *}; | ||
} | ||
|
||
pub mod bytes { | ||
pub use molecule::bytes::{self, *}; | ||
} | ||
|
||
pub mod prelude { | ||
pub use molecule::prelude::*; | ||
} | ||
|
||
pub mod primitive { | ||
pub use molecule::primitive::{self, *}; | ||
} | ||
|
||
pub mod primitives { | ||
include!(concat!(env!("OUT_DIR"), "/primitive_types.rs")); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
use crate::prelude::*; | ||
use crate::primitives::*; | ||
|
||
pub trait Unpack<T> { | ||
/// Unpack binary data into rust types. | ||
fn unpack(&self) -> T; | ||
} | ||
|
||
/// A syntactic sugar to convert a rust type into binary data. | ||
pub trait Pack<T: Entity> { | ||
/// Packs a rust type into binary data. | ||
fn pack(&self) -> T; | ||
} | ||
|
||
macro_rules! impl_conversion_for_entity_unpack { | ||
($original:ty, $entity:ident) => { | ||
impl Unpack<$original> for $entity { | ||
fn unpack(&self) -> $original { | ||
self.as_reader().unpack() | ||
} | ||
} | ||
}; | ||
} | ||
|
||
impl Pack<Uint64> for u64 { | ||
fn pack(&self) -> Uint64 { | ||
Uint64::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<u64> for Uint64Reader<'r> { | ||
fn unpack(&self) -> u64 { | ||
let mut b = [0u8; 8]; | ||
b.copy_from_slice(self.as_slice()); | ||
u64::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(u64, Uint64); | ||
|
||
impl Pack<Uint32> for u32 { | ||
fn pack(&self) -> Uint32 { | ||
Uint32::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<u32> for Uint32Reader<'r> { | ||
fn unpack(&self) -> u32 { | ||
let mut b = [0u8; 4]; | ||
b.copy_from_slice(self.as_slice()); | ||
u32::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(u32, Uint32); | ||
|
||
impl Pack<Uint16> for u16 { | ||
fn pack(&self) -> Uint16 { | ||
Uint16::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<u16> for Uint16Reader<'r> { | ||
fn unpack(&self) -> u16 { | ||
let mut b = [0u8; 2]; | ||
b.copy_from_slice(self.as_slice()); | ||
u16::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(u16, Uint16); | ||
|
||
impl Pack<Uint8> for u8 { | ||
fn pack(&self) -> Uint8 { | ||
Uint8::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<u8> for Uint8Reader<'r> { | ||
fn unpack(&self) -> u8 { | ||
let mut b = [0u8; 1]; | ||
b.copy_from_slice(self.as_slice()); | ||
u8::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(u8, Uint8); | ||
|
||
// Signed integers | ||
|
||
impl Pack<Int64> for i64 { | ||
fn pack(&self) -> Int64 { | ||
Int64::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<i64> for Int64Reader<'r> { | ||
fn unpack(&self) -> i64 { | ||
let mut b = [0u8; 8]; | ||
b.copy_from_slice(self.as_slice()); | ||
i64::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(i64, Int64); | ||
|
||
impl Pack<Int32> for i32 { | ||
fn pack(&self) -> Int32 { | ||
Int32::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<i32> for Int32Reader<'r> { | ||
fn unpack(&self) -> i32 { | ||
let mut b = [0u8; 4]; | ||
b.copy_from_slice(self.as_slice()); | ||
i32::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(i32, Int32); | ||
|
||
impl Pack<Int16> for i16 { | ||
fn pack(&self) -> Int16 { | ||
Int16::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<i16> for Int16Reader<'r> { | ||
fn unpack(&self) -> i16 { | ||
let mut b = [0u8; 2]; | ||
b.copy_from_slice(self.as_slice()); | ||
i16::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(i16, Int16); | ||
|
||
impl Pack<Int8> for i8 { | ||
fn pack(&self) -> Int8 { | ||
Int8::new_unchecked(Bytes::from(self.to_le_bytes().to_vec())) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<i8> for Int8Reader<'r> { | ||
fn unpack(&self) -> i8 { | ||
let mut b = [0u8; 1]; | ||
b.copy_from_slice(self.as_slice()); | ||
i8::from_le_bytes(b) | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(i8, Int8); | ||
|
||
// Bool | ||
impl Pack<Bool> for bool { | ||
fn pack(&self) -> Bool { | ||
let b = u8::from(*self); | ||
Bool::new_unchecked(Bytes::from(vec![b])) | ||
} | ||
} | ||
|
||
impl<'r> Unpack<bool> for BoolReader<'r> { | ||
fn unpack(&self) -> bool { | ||
match self.as_slice()[0] { | ||
0 => false, | ||
1 => true, | ||
_ => unreachable!(), | ||
} | ||
} | ||
} | ||
impl_conversion_for_entity_unpack!(bool, Bool); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters