@@ -30,17 +30,25 @@ impl PartialEq for MutationTableRow {
3030}
3131
3232fn make_mutation_table_row ( table : & MutationTable , pos : tsk_id_t ) -> Option < MutationTableRow > {
33- let table_ref = table. table_ ;
34- Some ( MutationTableRow {
35- id : pos. into ( ) ,
36- site : table. site ( pos) . ok ( ) ?,
37- node : table. node ( pos) . ok ( ) ?,
38- parent : table. parent ( pos) . ok ( ) ?,
39- time : table. time ( pos) . ok ( ) ?,
40- derived_state : table. derived_state ( pos) . ok ( ) ?. map ( |s| s. to_vec ( ) ) ,
41- metadata : table_row_decode_metadata ! ( table, table_ref, pos) . map ( |m| m. to_vec ( ) ) ,
42- } )
33+ let index = ll_bindings:: tsk_size_t:: try_from ( pos) . ok ( ) ?;
34+ match index {
35+ i if i < table. num_rows ( ) => {
36+ let table_ref = table. table_ ;
37+ let derived_state = table. derived_state ( pos) . map ( |s| s. to_vec ( ) ) ;
38+ Some ( MutationTableRow {
39+ id : pos. into ( ) ,
40+ site : table. site ( pos) . ok ( ) ?,
41+ node : table. node ( pos) . ok ( ) ?,
42+ parent : table. parent ( pos) . ok ( ) ?,
43+ time : table. time ( pos) . ok ( ) ?,
44+ derived_state,
45+ metadata : table_row_decode_metadata ! ( table, table_ref, pos) . map ( |m| m. to_vec ( ) ) ,
46+ } )
47+ }
48+ _ => None ,
49+ }
4350}
51+
4452pub ( crate ) type MutationTableRefIterator < ' a > =
4553 crate :: table_iterator:: TableIterator < & ' a MutationTable < ' a > > ;
4654pub ( crate ) type MutationTableIterator < ' a > = crate :: table_iterator:: TableIterator < MutationTable < ' a > > ;
@@ -143,10 +151,7 @@ impl<'a> MutationTable<'a> {
143151 ///
144152 /// Will return [``IndexError``](crate::TskitError::IndexError)
145153 /// if ``row`` is out of range.
146- pub fn derived_state < M : Into < MutationId > > (
147- & ' a self ,
148- row : M ,
149- ) -> Result < Option < & [ u8 ] > , TskitError > {
154+ pub fn derived_state < M : Into < MutationId > > ( & ' a self , row : M ) -> Option < & [ u8 ] > {
150155 metadata:: char_column_to_slice (
151156 self ,
152157 self . table_ . derived_state ,
@@ -160,10 +165,10 @@ impl<'a> MutationTable<'a> {
160165 pub fn metadata < T : metadata:: MetadataRoundtrip > (
161166 & ' a self ,
162167 row : MutationId ,
163- ) -> Result < Option < T > , TskitError > {
168+ ) -> Option < Result < T , TskitError > > {
164169 let table_ref = self . table_ ;
165170 let buffer = metadata_to_vector ! ( self , table_ref, row. 0 ) ?;
166- decode_metadata_row ! ( T , buffer)
171+ Some ( decode_metadata_row ! ( T , buffer) . map_err ( |e| e . into ( ) ) )
167172 }
168173
169174 /// Return an iterator over rows of the table.
@@ -226,12 +231,13 @@ build_owned_table_type!(
226231/// let rowid = mutations.add_row_with_metadata(0, 1, 5, 10.0, None, &metadata).unwrap();
227232/// assert_eq!(rowid, 0);
228233///
229- /// if let Some(decoded) = mutations.metadata::<MutationMetadata>(rowid).unwrap() {
230- /// assert_eq!(decoded.value, 42);
231- /// } else {
232- /// panic!("hmm...we expected some metadata!");
234+ /// match mutations.metadata::<MutationMetadata>(rowid) {
235+ /// // rowid is in range, decoding succeeded
236+ /// Some(Ok(decoded)) => assert_eq!(decoded.value, 42),
237+ /// // rowid is in range, decoding failed
238+ /// Some(Err(e)) => panic!("error decoding metadata: {:?}", e),
239+ /// None => panic!("row id out of range")
233240/// }
234- ///
235241/// # }
236242/// ```
237243 => OwnedMutationTable ,
0 commit comments