|
| 1 | +use core::str; |
| 2 | + |
1 | 3 | use tskit::metadata::MetadataRoundtrip; |
2 | 4 |
|
3 | 5 | struct MutationMetadata { |
@@ -37,12 +39,28 @@ struct IndividualMetadata { |
37 | 39 |
|
38 | 40 | impl MetadataRoundtrip for IndividualMetadata { |
39 | 41 | 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) |
41 | 51 | } |
42 | 52 | fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError> |
43 | 53 | where |
44 | 54 | Self: Sized, |
45 | 55 | { |
| 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"); |
46 | 64 | todo!() |
47 | 65 | } |
48 | 66 | } |
@@ -102,7 +120,8 @@ fn test_mutation_metadata_roundtrip() { |
102 | 120 | #[test] |
103 | 121 | fn test_individual_metadata_roundtrip() { |
104 | 122 | let md = IndividualMetadata { |
105 | | - name: "Jerome".to_string(), phenotypes: vec![10,9] |
| 123 | + name: "Jerome".to_string(), |
| 124 | + phenotypes: vec![10, 9], |
106 | 125 | }; |
107 | 126 | let encoded = md.encode().unwrap(); |
108 | 127 | let decoded = IndividualMetadata::decode(&encoded).unwrap(); |
|
0 commit comments