Skip to content

Commit d1b40a9

Browse files
committed
more impl
1 parent 760f431 commit d1b40a9

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

examples/manual_metadata_encoding.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::str;
2+
13
use tskit::metadata::MetadataRoundtrip;
24

35
struct MutationMetadata {
@@ -37,12 +39,28 @@ struct IndividualMetadata {
3739

3840
impl MetadataRoundtrip for IndividualMetadata {
3941
fn encode(&self) -> Result<Vec<u8>, tskit::metadata::MetadataError> {
40-
todo!()
42+
let mut rv = vec![];
43+
rv.extend_from_slice(self.name.len().to_be_bytes().as_slice());
44+
rv.extend_from_slice(self.name.as_bytes());
45+
println!("{} {:?}", self.name, self.name.as_bytes());
46+
rv.extend_from_slice(self.phenotypes.len().to_be_bytes().as_slice());
47+
for i in self.phenotypes.iter() {
48+
rv.extend_from_slice(i.to_be_bytes().as_slice());
49+
}
50+
Ok(rv)
4151
}
4252
fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError>
4353
where
4454
Self: Sized,
4555
{
56+
let size: [u8; std::mem::size_of::<usize>()] =
57+
md[0..std::mem::size_of::<usize>()].try_into().unwrap();
58+
let size = usize::from_be_bytes(size);
59+
let name =
60+
str::from_utf8(&md[std::mem::size_of::<usize>()..size + std::mem::size_of::<usize>()])
61+
.unwrap()
62+
.to_string();
63+
assert_eq!(name, "Jerome");
4664
todo!()
4765
}
4866
}
@@ -102,7 +120,8 @@ fn test_mutation_metadata_roundtrip() {
102120
#[test]
103121
fn test_individual_metadata_roundtrip() {
104122
let md = IndividualMetadata {
105-
name: "Jerome".to_string(), phenotypes: vec![10,9]
123+
name: "Jerome".to_string(),
124+
phenotypes: vec![10, 9],
106125
};
107126
let encoded = md.encode().unwrap();
108127
let decoded = IndividualMetadata::decode(&encoded).unwrap();

0 commit comments

Comments
 (0)