Add trait implementation for () type

main
trivernis 2 years ago
parent 6f7c10bdd0
commit 4fbdda3564
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -3,7 +3,7 @@ members = [".", "derive"]
[package]
name = "rusty-value"
version = "0.2.1"
version = "0.3.0"
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/Trivernis/rusty-value"

@ -1,5 +1,34 @@
# Rusty Value
[![](https://img.shields.io/crates/v/rusty-value?style=for-the-badge)](https://crates.io/crates/rusty-value)
[![](https://img.shields.io/docsrs/rusty-value/latest?style=for-the-badge)](https://docs.rs/rusty-value/)
This crate adds a `RustyValue` trait that can be derived for all types (except unions)
to create a generic value that represents a rust value.
This can be used to implement serialization of types without having to rely on serde.
## Usage
The trait `RustyValue` allows one to create a `rusty_value::Value` for any
type that implements it. This trait can be derived if the `derive` **feature** is enabled.
```rust
use rusty_value::RustyValue;
#[derive(RustyValue)]
struct MyStruct {
foo: String,
bar: u8,
}
fn main() {
MyStruct {
foo: "Hello World".to_string(),
bar: 12,
}.into_rusty_value();
}
```
Converting a type into a rusty value cannot fail as `rusty_value::RustyValue` is
able to represent any safe rust data type. The trait `RustyValue` is already implemented for
most std types and can therefore be easily derived.

@ -1,3 +1,5 @@
#![doc=include_str!("../README.md")]
pub(crate) mod value;
pub(crate) mod value_trait;
pub use value::*;

@ -8,6 +8,7 @@ pub enum Value {
Enum(Enum),
Map(HashMap<HashableValue, Value>),
List(Vec<Value>),
None,
}
/// Represents an enum with a given variant
@ -73,6 +74,7 @@ pub enum Float {
pub enum HashableValue {
Primitive(HashablePrimitive),
List(Vec<HashableValue>),
None,
}
/// A primitive that can be used as a hash map key

@ -114,6 +114,12 @@ impl HashableRustyValue for bool {
}
}
impl HashableRustyValue for () {
fn into_hashable_rusty_value(self) -> HashableValue {
HashableValue::None
}
}
impl RustyValue for HashableValue {
fn into_rusty_value(self) -> Value {
match self {
@ -126,6 +132,7 @@ impl RustyValue for HashableValue {
HashableValue::List(l) => {
Value::List(l.into_iter().map(|v| v.into_rusty_value()).collect())
}
HashableValue::None => Value::None,
}
}
}

@ -4,6 +4,7 @@ use rusty_value::{Fields, RustyValue, Value};
struct TestStructNamed {
foo: String,
bar: u64,
none: (),
}
#[test]
@ -11,6 +12,7 @@ fn it_handles_named_fields() {
let test_struct = TestStructNamed {
foo: String::from("Hello World"),
bar: 12,
none: (),
};
let value = test_struct.into_rusty_value();
dbg!(&value);
@ -19,7 +21,7 @@ fn it_handles_named_fields() {
assert_eq!(&s.name, "TestStructNamed");
if let Fields::Named(fields) = s.fields {
assert_eq!(fields.len(), 2);
assert_eq!(fields.len(), 3);
} else {
panic!("Struct wasn't serialized as named struct")
}

Loading…
Cancel
Save