Skip to content

Commit 25596a8

Browse files
authored
feat: make load from file generic over AsRef<str> (#254)
* for TableCollection::new_from_file * for TreeSequence::load
1 parent cf545e0 commit 25596a8

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/table_collection.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,55 @@ impl TableCollection {
127127
///
128128
/// # Examples
129129
///
130+
/// The function is generic over references to `str`:
131+
///
130132
/// ```
131133
/// # let empty_tables = tskit::TableCollection::new(100.).unwrap();
132134
/// # empty_tables.dump("trees.file", tskit::TableOutputOptions::default()).unwrap();
133135
/// let tables = tskit::TableCollection::new_from_file("trees.file").unwrap();
134136
/// # std::fs::remove_file("trees.file").unwrap();
135137
/// ```
136138
///
139+
/// ```
140+
/// # let empty_tables = tskit::TableCollection::new(100.).unwrap();
141+
/// # empty_tables.dump("trees.file", tskit::TableOutputOptions::default()).unwrap();
142+
/// let filename = String::from("trees.file");
143+
/// // Move filename
144+
/// let tables = tskit::TableCollection::new_from_file(filename).unwrap();
145+
/// # std::fs::remove_file("trees.file").unwrap();
146+
/// ```
147+
///
148+
/// ```
149+
/// # let empty_tables = tskit::TableCollection::new(100.).unwrap();
150+
/// # empty_tables.dump("trees.file", tskit::TableOutputOptions::default()).unwrap();
151+
/// let filename = String::from("trees.file");
152+
/// // Pass filename by reference
153+
/// let tables = tskit::TableCollection::new_from_file(&filename).unwrap();
154+
/// # std::fs::remove_file("trees.file").unwrap();
155+
/// ```
156+
///
157+
/// Boxed `String`s are an unlikely use case, but can be made to work:
158+
///
159+
/// ```
160+
/// # let empty_tables = tskit::TableCollection::new(100.).unwrap();
161+
/// # empty_tables.dump("trees.file", tskit::TableOutputOptions::default()).unwrap();
162+
/// let filename = Box::new(String::from("trees.file"));
163+
/// let tables = tskit::TableCollection::new_from_file(&*filename.as_ref()).unwrap();
164+
/// # std::fs::remove_file("trees.file").unwrap();
165+
/// ```
166+
///
137167
/// # Panics
138168
///
139169
/// This function allocates a `CString` to pass the file name to the C API.
140170
/// A panic will occur if the system runs out of memory.
141-
pub fn new_from_file(filename: &str) -> Result<Self, TskitError> {
171+
pub fn new_from_file(filename: impl AsRef<str>) -> Result<Self, TskitError> {
142172
// Arbitrary sequence_length.
143173
let mut tables = match TableCollection::new(1.0) {
144174
Ok(t) => (t),
145175
Err(e) => return Err(e),
146176
};
147177

148-
let c_str = std::ffi::CString::new(filename).unwrap();
178+
let c_str = std::ffi::CString::new(filename.as_ref()).unwrap();
149179
let rv = unsafe {
150180
ll_bindings::tsk_table_collection_load(
151181
tables.as_mut_ptr(),

src/trees.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,8 +1042,11 @@ impl TreeSequence {
10421042
}
10431043

10441044
/// Load from a file.
1045-
pub fn load(filename: &str) -> Result<Self, TskitError> {
1046-
let tables = TableCollection::new_from_file(filename)?;
1045+
///
1046+
/// This function calls [`TableCollection::new_from_file`] with
1047+
/// [`TreeSequenceFlags::default`].
1048+
pub fn load(filename: impl AsRef<str>) -> Result<Self, TskitError> {
1049+
let tables = TableCollection::new_from_file(filename.as_ref())?;
10471050

10481051
Self::new(tables, TreeSequenceFlags::default())
10491052
}

0 commit comments

Comments
 (0)