@@ -653,8 +653,54 @@ fn from_value_is_integer() {
653
653
654
654
#[ cfg( test) ]
655
655
mod tests {
656
- use crate :: row:: convert:: FromRow ;
657
- use crate :: { constants:: ColumnType , packets:: Column , row:: new_row} ;
656
+ use crate :: {
657
+ constants:: ColumnType ,
658
+ packets:: Column ,
659
+ row:: { convert:: FromRow , new_row} ,
660
+ value:: { convert:: from_value, Value } ,
661
+ FromValueError ,
662
+ } ;
663
+ use unic_langid:: LanguageIdentifier ;
664
+
665
+ #[ derive( FromValue ) ]
666
+ #[ mysql( serialize_with = "from_langid" , deserialize_with = "to_langid" ) ]
667
+ struct LangId ( LanguageIdentifier ) ;
668
+
669
+ impl std:: ops:: Deref for LangId {
670
+ type Target = LanguageIdentifier ;
671
+
672
+ fn deref ( & self ) -> & Self :: Target {
673
+ & self . 0
674
+ }
675
+ }
676
+
677
+ fn to_langid ( v : Value ) -> Result < LanguageIdentifier , FromValueError > {
678
+ match v {
679
+ Value :: Bytes ( ref b) => match LanguageIdentifier :: from_bytes ( b) {
680
+ Ok ( ident) => Ok ( ident) ,
681
+ Err ( _) => Err ( FromValueError ( v) ) ,
682
+ } ,
683
+ _ => Err ( FromValueError ( v) ) ,
684
+ }
685
+ }
686
+
687
+ fn from_langid ( land_id : LanguageIdentifier ) -> Value {
688
+ Value :: Bytes ( land_id. to_string ( ) . into ( ) )
689
+ }
690
+
691
+ #[ test]
692
+ fn newtype_with ( ) {
693
+ let mut value = Value :: Bytes ( b"en-US" . into ( ) ) ;
694
+
695
+ let ident = from_value :: < LangId > ( value) ;
696
+
697
+ assert_eq ! ( ident. language. to_string( ) . as_str( ) , "en" ) ;
698
+ assert_eq ! ( ident. to_string( ) . as_str( ) , "en-US" ) ;
699
+
700
+ value = ident. into ( ) ;
701
+
702
+ assert_eq ! ( value, Value :: Bytes ( b"en-US" . into( ) ) ) ;
703
+ }
658
704
659
705
#[ test]
660
706
fn from_row_derive ( ) {
0 commit comments