11// This is a rust implementation of the example
22// found in tskit-c
33
4- use anyhow:: Result ;
54use clap:: Parser ;
65#[ cfg( test) ]
76use rand:: distributions:: Distribution ;
87use rand:: prelude:: * ;
98use rand:: SeedableRng ;
109
10+ #[ derive( Debug ) ]
11+ enum Error {
12+ Tskit ( tskit:: TskitError ) ,
13+ Message ( String ) ,
14+ }
15+
16+ impl From < tskit:: TskitError > for Error {
17+ fn from ( value : tskit:: TskitError ) -> Self {
18+ Self :: Tskit ( value)
19+ }
20+ }
21+
22+ impl std:: fmt:: Display for Error {
23+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
24+ match self {
25+ Self :: Tskit ( e) => write ! ( f, "{e}" ) ,
26+ Self :: Message ( m) => write ! ( f, "{m}" ) ,
27+ }
28+ }
29+ }
30+
31+ impl std:: error:: Error for Error { }
32+
1133fn rotate_edges ( bookmark : & tskit:: types:: Bookmark , tables : & mut tskit:: TableCollection ) {
1234 let num_edges = tables. edges ( ) . num_rows ( ) . as_usize ( ) ;
1335 let left =
@@ -32,15 +54,15 @@ fn simulate(
3254 num_generations : i32 ,
3355 simplify_interval : i32 ,
3456 update_bookmark : bool ,
35- ) -> Result < tskit:: TreeSequence > {
57+ ) -> Result < tskit:: TreeSequence , Error > {
3658 if popsize == 0 {
37- return Err ( anyhow :: Error :: msg ( "popsize must be > 0" ) ) ;
59+ return Err ( Error :: Message ( "popsize must be > 0" . to_string ( ) ) ) ;
3860 }
3961 if num_generations == 0 {
40- return Err ( anyhow :: Error :: msg ( "num_generations must be > 0" ) ) ;
62+ return Err ( Error :: Message ( "num_generations must be > 0" . to_string ( ) ) ) ;
4163 }
4264 if simplify_interval == 0 {
43- return Err ( anyhow :: Error :: msg ( "simplify_interval must be > 0" ) ) ;
65+ return Err ( Error :: Message ( "simplify_interval must be > 0" . to_string ( ) ) ) ;
4466 }
4567 let mut tables = tskit:: TableCollection :: new ( 1.0 ) ?;
4668
@@ -72,10 +94,10 @@ fn simulate(
7294 let child = tables. add_node ( 0 , bt, -1 , -1 ) ?;
7395 let left_parent = parents
7496 . get ( parent_picker. sample ( & mut rng) )
75- . ok_or_else ( || anyhow :: Error :: msg ( "invalid left_parent index" ) ) ?;
97+ . ok_or_else ( || Error :: Message ( "invalid left_parent index" . to_string ( ) ) ) ?;
7698 let right_parent = parents
7799 . get ( parent_picker. sample ( & mut rng) )
78- . ok_or_else ( || anyhow :: Error :: msg ( "invalid right_parent index" ) ) ?;
100+ . ok_or_else ( || Error :: Message ( "invalid right_parent index" . to_string ( ) ) ) ?;
79101 let breakpoint = breakpoint_generator. sample ( & mut rng) ;
80102 tables. add_edge ( 0. , breakpoint, * left_parent, child) ?;
81103 tables. add_edge ( breakpoint, 1.0 , * right_parent, child) ?;
@@ -120,7 +142,7 @@ struct SimParams {
120142 bookmark : bool ,
121143}
122144
123- fn main ( ) -> Result < ( ) > {
145+ fn main ( ) -> Result < ( ) , Error > {
124146 let params = SimParams :: parse ( ) ;
125147 let treeseq = simulate (
126148 params. seed ,
0 commit comments