@@ -61,7 +61,7 @@ impl Document {
6161 pub fn folder ( & self , path : & [ LayerId ] ) -> Result < & Folder , DocumentError > {
6262 let mut root = & self . root ;
6363 for id in path {
64- root = root. as_folder ( ) ?. layer ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
64+ root = root. as_folder ( ) ?. layer ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
6565 }
6666 root. as_folder ( )
6767 }
@@ -72,7 +72,7 @@ impl Document {
7272 fn folder_mut ( & mut self , path : & [ LayerId ] ) -> Result < & mut Folder , DocumentError > {
7373 let mut root = & mut self . root ;
7474 for id in path {
75- root = root. as_folder_mut ( ) ?. layer_mut ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
75+ root = root. as_folder_mut ( ) ?. layer_mut ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
7676 }
7777 root. as_folder_mut ( )
7878 }
@@ -83,7 +83,7 @@ impl Document {
8383 return Ok ( & self . root ) ;
8484 }
8585 let ( path, id) = split_path ( path) ?;
86- self . folder ( path) ?. layer ( id) . ok_or ( DocumentError :: LayerNotFound )
86+ self . folder ( path) ?. layer ( id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) )
8787 }
8888
8989 /// Returns a mutable reference to the layer or folder at the path.
@@ -92,10 +92,10 @@ impl Document {
9292 return Ok ( & mut self . root ) ;
9393 }
9494 let ( path, id) = split_path ( path) ?;
95- self . folder_mut ( path) ?. layer_mut ( id) . ok_or ( DocumentError :: LayerNotFound )
95+ self . folder_mut ( path) ?. layer_mut ( id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) )
9696 }
9797
98- pub fn deepest_common_folder < ' a > ( & self , layers : impl Iterator < Item = & ' a [ LayerId ] > ) -> Result < & ' a [ LayerId ] , DocumentError > {
98+ pub fn shallowest_common_folder < ' a > ( & self , layers : impl Iterator < Item = & ' a [ LayerId ] > ) -> Result < & ' a [ LayerId ] , DocumentError > {
9999 let common_prefix_of_path = self . common_layer_path_prefix ( layers) ;
100100
101101 Ok ( match self . layer ( common_prefix_of_path) ?. data {
@@ -113,6 +113,10 @@ impl Document {
113113 . unwrap_or_default ( )
114114 }
115115
116+ pub fn is_folder ( & self , path : & [ LayerId ] ) -> bool {
117+ return self . folder ( path) . is_ok ( ) ;
118+ }
119+
116120 // Determines which layer is closer to the root, if path_a return true, if path_b return false
117121 // Answers the question: Is A closer to the root than B?
118122 pub fn layer_closer_to_root ( & self , path_a : & [ u64 ] , path_b : & [ u64 ] ) -> bool {
@@ -136,9 +140,9 @@ impl Document {
136140 false
137141 }
138142
139- // Is the target layer between a <-> b layers, inclusive
143+ // Is the target layer between a <-> b layers, inclusive
140144 pub fn layer_is_between ( & self , target : & [ u64 ] , path_a : & [ u64 ] , path_b : & [ u64 ] ) -> bool {
141- // If the target is a nonsense path , it isn't between
145+ // If the target is the root , it isn't between
142146 if target. is_empty ( ) {
143147 return false ;
144148 }
@@ -165,12 +169,12 @@ impl Document {
165169
166170 // TODO: appears to be n^2? should we maintain a lookup table?
167171 for id in path {
168- let pos = root. layer_ids . iter ( ) . position ( |x| * x == * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
172+ let pos = root. layer_ids . iter ( ) . position ( |x| * x == * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
169173 indices. push ( pos) ;
170- root = root. folder ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
174+ root = root. folder ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
171175 }
172176
173- indices. push ( root. layer_ids . iter ( ) . position ( |x| * x == layer_id) . ok_or ( DocumentError :: LayerNotFound ) ?) ;
177+ indices. push ( root. layer_ids . iter ( ) . position ( |x| * x == layer_id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?) ;
174178
175179 Ok ( indices)
176180 }
@@ -264,7 +268,7 @@ impl Document {
264268 let mut root = & mut self . root ;
265269 root. cache_dirty = true ;
266270 for id in path {
267- root = root. as_folder_mut ( ) ?. layer_mut ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
271+ root = root. as_folder_mut ( ) ?. layer_mut ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
268272 root. cache_dirty = true ;
269273 }
270274 Ok ( ( ) )
@@ -297,7 +301,7 @@ impl Document {
297301 let mut transforms = vec ! [ self . root. transform] ;
298302 for id in path {
299303 if let Ok ( folder) = root. as_folder ( ) {
300- root = folder. layer ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
304+ root = folder. layer ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
301305 }
302306 transforms. push ( root. transform ) ;
303307 }
@@ -309,7 +313,7 @@ impl Document {
309313 let mut trans = self . root . transform ;
310314 for id in path {
311315 if let Ok ( folder) = root. as_folder ( ) {
312- root = folder. layer ( * id) . ok_or ( DocumentError :: LayerNotFound ) ?;
316+ root = folder. layer ( * id) . ok_or_else ( || DocumentError :: LayerNotFound ( path . into ( ) ) ) ?;
313317 }
314318 trans = trans * root. transform ;
315319 }
0 commit comments