1- use std:: collections:: HashMap ;
2-
31use crate :: { Error , Result , Version } ;
42use serde:: { de:: DeserializeOwned , Serialize } ;
53use serde_json:: { Map , Value } ;
4+ use std:: collections:: HashMap ;
65
76/// Migrates a STAC object from one version to another.
8- pub trait Migrate : Sized + Serialize + DeserializeOwned {
7+ pub trait Migrate : Sized + Serialize + DeserializeOwned + std :: fmt :: Debug {
98 /// Migrates this object to another version.
109 ///
1110 /// # Examples
@@ -14,17 +13,17 @@ pub trait Migrate: Sized + Serialize + DeserializeOwned {
1413 /// use stac::{Item, Migrate, Version};
1514 ///
1615 /// let mut item: Item = stac::read("../spec-examples/v1.0.0/simple-item.json").unwrap();
17- /// let item = item.migrate(Version::v1_1_0_beta_1).unwrap();
16+ /// let item = item.migrate(& Version::v1_1_0_beta_1).unwrap();
1817 /// assert_eq!(item.version, Version::v1_1_0_beta_1);
1918 /// ```
20- fn migrate ( self , to : Version ) -> Result < Self > {
19+ fn migrate ( self , to : & Version ) -> Result < Self > {
2120 let mut value = serde_json:: to_value ( self ) ?;
2221 if let Some ( version) = value
2322 . as_object ( )
2423 . and_then ( |object| object. get ( "stac_version" ) )
2524 . and_then ( |version| version. as_str ( ) )
2625 {
27- let from: Version = version. parse ( ) ? ;
26+ let from: Version = version. parse ( ) . unwrap ( ) ; // infallible
2827 let steps = from. steps ( to) ?;
2928 for step in steps {
3029 value = step. migrate ( value) ?;
@@ -46,16 +45,18 @@ enum Step {
4645}
4746
4847impl Version {
49- fn steps ( self , to : Version ) -> Result < Vec < Step > > {
48+ fn steps ( self , to : & Version ) -> Result < Vec < Step > > {
5049 match self {
5150 Version :: v1_0_0 => match to {
5251 Version :: v1_0_0 => Ok ( Vec :: new ( ) ) ,
5352 Version :: v1_1_0_beta_1 => Ok ( vec ! [ Step :: v1_0_0_to_v1_1_0_beta_1] ) ,
53+ _ => Err ( Error :: UnsupportedMigration ( self , to. clone ( ) ) ) ,
5454 } ,
5555 Version :: v1_1_0_beta_1 => match to {
56- Version :: v1_0_0 => Err ( Error :: UnsupportedMigration ( self , to) ) ,
5756 Version :: v1_1_0_beta_1 => Ok ( Vec :: new ( ) ) ,
57+ _ => Err ( Error :: UnsupportedMigration ( self , to. clone ( ) ) ) ,
5858 } ,
59+ Version :: Unknown ( _) => Err ( Error :: UnsupportedMigration ( self , to. clone ( ) ) ) ,
5960 }
6061 }
6162}
@@ -215,7 +216,7 @@ mod tests {
215216 #[ test]
216217 fn migrate_v1_0_0_to_v1_1_0_beta_1 ( ) {
217218 let item: Item = crate :: read ( "data/bands-v1.0.0.json" ) . unwrap ( ) ;
218- let item = item. migrate ( Version :: v1_1_0_beta_1) . unwrap ( ) ;
219+ let item = item. migrate ( & Version :: v1_1_0_beta_1) . unwrap ( ) ;
219220 let asset = & item. assets [ "example" ] ;
220221 assert_eq ! ( asset. data_type. as_ref( ) . unwrap( ) , & DataType :: UInt16 ) ;
221222 assert_eq ! ( asset. bands[ 0 ] . name. as_ref( ) . unwrap( ) , "r" ) ;
@@ -229,20 +230,20 @@ mod tests {
229230 assert_json_eq ! ( expected, serde_json:: to_value( item) . unwrap( ) ) ;
230231
231232 let collection = Collection :: new ( "an-id" , "a description" ) ;
232- let collection = collection. migrate ( Version :: v1_1_0_beta_1) . unwrap ( ) ;
233+ let collection = collection. migrate ( & Version :: v1_1_0_beta_1) . unwrap ( ) ;
233234 assert_eq ! ( collection. license, "other" ) ;
234235
235236 let mut item = Item :: new ( "an-id" ) ;
236237 item. set_link ( Link :: self_ ( "/an/absolute/href" ) ) ;
237- let item = item. migrate ( Version :: v1_1_0_beta_1) . unwrap ( ) ;
238+ let item = item. migrate ( & Version :: v1_1_0_beta_1) . unwrap ( ) ;
238239 assert_eq ! ( item. link( "self" ) . unwrap( ) . href, "file:///an/absolute/href" ) ;
239240 }
240241
241242 #[ test]
242243 fn remove_empty_bands ( ) {
243244 // https://github.com/stac-utils/stac-rs/issues/350
244245 let item: Item = crate :: read ( "data/20201211_223832_CS2.json" ) . unwrap ( ) ;
245- let item = item. migrate ( Version :: v1_1_0_beta_1) . unwrap ( ) ;
246+ let item = item. migrate ( & Version :: v1_1_0_beta_1) . unwrap ( ) ;
246247 let asset = & item. assets [ "data" ] ;
247248 assert ! ( asset. bands. is_empty( ) ) ;
248249 }
0 commit comments