Skip to content

Commit

Permalink
[db] Add serialize derive macro #1433 (#1434)
Browse files Browse the repository at this point in the history
* Update raft.rs

* Update lib.rs

* Update lib.rs

* Update db_user_value_test.rs

* test reorg for features

* Delete storage2

* Update lib.rs

* Update mod.rs

* Update lib.rs

* Update lib.rs

* Update memory_storage.rs
  • Loading branch information
michaelvlach authored Jan 1, 2025
1 parent b11008f commit 8b95238
Show file tree
Hide file tree
Showing 9 changed files with 407 additions and 14 deletions.
5 changes: 5 additions & 0 deletions agdb/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
//! // QueryResult { result: 1, elements: [ DbElement { id: DbId(1), values: [ DbKeyValue { key: String("key"), value: Int(123) } ] } ] }
//! ```
extern crate self as agdb;

mod collections;
mod command;
mod db;
Expand All @@ -36,6 +38,9 @@ pub mod test_utilities;
#[cfg(any(feature = "serde", feature = "openapi"))]
pub use query::QueryType;

#[cfg(feature = "derive")]
pub use agdb_derive::AgdbDeSerialize;

#[cfg(feature = "derive")]
pub use agdb_derive::{UserValue, UserValueMarker};

Expand Down
6 changes: 0 additions & 6 deletions agdb/src/storage/memory_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,6 @@ mod tests {
use crate::utilities::serialize::Serialize;
use crate::utilities::serialize::SerializeStatic;

#[test]
fn backup_does_nothing() {
let storage = Storage::<MemoryStorage>::new("storage").unwrap();
assert!(storage.backup("storage2").is_ok())
}

#[test]
fn name() {
let storage = Storage::<MemoryStorage>::new("storage").unwrap();
Expand Down
Binary file removed agdb/storage2
Binary file not shown.
7 changes: 6 additions & 1 deletion agdb/tests/db_test.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
#[cfg(feature = "derive")]
mod derive_feature_test;
#[cfg(feature = "derive")]
mod efficient_agdb;
#[cfg(feature = "openapi")]
mod openapi_feature_test;
#[cfg(feature = "derive")]
mod quickstart;
#[cfg(feature = "serde")]
mod serde_feature_test;
mod test_db;
Expand Down Expand Up @@ -78,7 +84,6 @@ fn public_types() {
use agdb::StorageSlice;
use agdb::Transaction;
use agdb::TransactionMut;
use agdb::UserValue;
}

#[test]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
mod test_db;
use crate::test_db::TestDb;

use agdb::AgdbDeSerialize;
use agdb::AgdbSerialize;
use agdb::DbElement;
use agdb::DbError;
use agdb::DbId;
Expand All @@ -10,8 +12,6 @@ use agdb::QueryId;
use agdb::QueryResult;
use agdb::UserValue;
use agdb::UserValueMarker;
#[allow(unused_imports)]
use test_db::TestDb;

#[derive(Default, Debug, Clone, PartialEq, UserValueMarker)]
enum Status {
Expand Down Expand Up @@ -816,3 +816,111 @@ fn try_from_db_element_bad_conversion() {
"Failed to convert value of 'password': Type mismatch. Cannot convert 'i64' to 'string'"
);
}

#[test]
fn derived_serialization_struct() {
#[derive(AgdbDeSerialize, Debug, PartialEq)]
struct S {
f1: u64,
f2: u64,
}

let s = S { f1: 1, f2: 2 };
let serialized = s.serialize();
let deserialized = S::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_tuple() {
#[derive(AgdbDeSerialize, Debug, PartialEq)]
struct S(u64, u64);

let s = S(1, 2);
let serialized = s.serialize();
let deserialized = S::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[derive(AgdbDeSerialize, Debug, PartialEq)]
struct S1 {
f1: u64,
}

#[derive(AgdbDeSerialize, Debug, PartialEq)]
struct S2(S1);

#[derive(AgdbDeSerialize, Debug, PartialEq)]
struct S3(S2, S2);

#[derive(AgdbDeSerialize, Debug, PartialEq)]
enum MyOtherEnum {
A,
B,
}

#[derive(AgdbDeSerialize, Debug, PartialEq)]
enum MyE {
A,
B(u64),
C(u64, u64),
D(S3),
E(MyOtherEnum),
F { f1: u64, f2: u64 },
}

#[test]
fn derived_serialization_enum_unit() {
let s = MyE::A;
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_enum_tuple() {
let s = MyE::B(1);
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_enum_tuple_multiple() {
let s = MyE::C(1, 2);
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_enum_nested_struct() {
let s = MyE::D(S3(S2(S1 { f1: 1 }), S2(S1 { f1: 2 })));
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_enum_nested_enum() {
let s = MyE::E(MyOtherEnum::A);
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}

#[test]
fn derived_serialization_enum_struct() {
let s = MyE::F { f1: 1, f2: 2 };
let serialized = s.serialize();
let deserialized = MyE::deserialize(&serialized).unwrap();

assert_eq!(s, deserialized);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
mod test_db;

use crate::test_db::TestFile;
use agdb::Comparison::Equal;
use agdb::CountComparison;
Expand Down
2 changes: 0 additions & 2 deletions agdb/tests/quickstart.rs → agdb/tests/quickstart/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
mod test_db;

use crate::test_db::TestFile;
use agdb::QueryError;
use agdb::{Comparison::Equal, Db, DbId, DbUserValue, QueryBuilder, UserValue};
Expand Down
Loading

0 comments on commit 8b95238

Please sign in to comment.