Skip to content

Commit 02b23d5

Browse files
authored
feat: sys::NodeTable::raw_metadata (#628)
* tskit::NodeTable internals use this new fn
1 parent e75d6ce commit 02b23d5

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/node_table.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ impl NodeTable {
590590
///
591591
/// * `Some(Ok(T))` if `row` is valid and decoding succeeded.
592592
/// * `Some(Err(_))` if `row` is not valid and decoding failed.
593-
/// * `None` if `row` is not valid.
593+
/// * `None` if `row` is not valid or the row has no metadata.
594594
///
595595
/// # Errors
596596
///
@@ -604,7 +604,7 @@ impl NodeTable {
604604
&self,
605605
row: NodeId,
606606
) -> Option<Result<T, TskitError>> {
607-
let buffer = self.raw_metadata(row)?;
607+
let buffer = self.table_.raw_metadata(row).ok()??;
608608
Some(decode_metadata_row!(T, buffer).map_err(|e| e.into()))
609609
}
610610

src/sys/node_table.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use super::bindings::tsk_node_table_add_row;
44
use super::bindings::tsk_node_table_clear;
55
use super::bindings::tsk_node_table_init;
66
use super::bindings::tsk_node_table_t;
7+
use super::newtypes::NodeId;
78
use super::tskbox::TskBox;
89
use super::TskitError;
910

@@ -82,6 +83,20 @@ impl NodeTable {
8283
code => Err(TskitError::ErrorCode { code }),
8384
}
8485
}
86+
87+
pub fn raw_metadata(&self, row: NodeId) -> Result<Option<&[u8]>, TskitError> {
88+
if row.is_null() || row.as_usize() >= self.as_ref().num_rows.try_into().unwrap() {
89+
Err(TskitError::IndexError)
90+
} else {
91+
Ok(super::tsk_ragged_column_access(
92+
row,
93+
self.as_ref().metadata,
94+
self.as_ref().metadata_length,
95+
self.as_ref().metadata_offset,
96+
self.as_ref().num_rows,
97+
))
98+
}
99+
}
85100
}
86101

87102
impl Default for NodeTable {

0 commit comments

Comments
 (0)