@@ -1989,38 +1989,42 @@ fn test_set_or_list_general_type_errors() {
19891989
19901990#[ test]
19911991fn test_set_or_list_elem_type_errors ( ) {
1992- let err = deserialize :: < Vec < i64 > > (
1993- & ColumnType :: Collection {
1994- frozen : false ,
1995- typ : CollectionType :: List ( Box :: new ( ColumnType :: Native ( NativeType :: Varint ) ) ) ,
1996- } ,
1997- & Bytes :: new ( ) ,
1998- )
1999- . unwrap_err ( ) ;
2000- let err = get_typeck_err ( & err) ;
2001- assert_eq ! ( err. rust_name, std:: any:: type_name:: <Vec <i64 >>( ) ) ;
2002- assert_eq ! (
2003- err. cql_type,
2004- ColumnType :: Collection {
2005- frozen: false ,
2006- typ: CollectionType :: List ( Box :: new( ColumnType :: Native ( NativeType :: Varint ) ) ) ,
2007- } ,
2008- ) ;
2009- let BuiltinTypeCheckErrorKind :: SetOrListError (
2010- SetOrListTypeCheckErrorKind :: ElementTypeCheckFailed ( ref err) ,
2011- ) = err. kind
2012- else {
2013- panic ! ( "unexpected error kind: {}" , err. kind)
1992+ let cql_type = ColumnType :: Collection {
1993+ frozen : false ,
1994+ typ : CollectionType :: Set ( Box :: new ( ColumnType :: Native ( NativeType :: Varint ) ) ) ,
20141995 } ;
2015- let err = get_typeck_err_inner ( err. 0 . as_ref ( ) ) ;
2016- assert_eq ! ( err. rust_name, std:: any:: type_name:: <i64 >( ) ) ;
2017- assert_eq ! ( err. cql_type, ColumnType :: Native ( NativeType :: Varint ) ) ;
2018- assert_matches ! (
2019- err. kind,
2020- BuiltinTypeCheckErrorKind :: MismatchedType {
2021- expected: & [ ColumnType :: Native ( NativeType :: BigInt ) ]
2022- }
2023- ) ;
1996+ // Explicitly passing frame and meta from outside is the only way I know to satisfy
1997+ // the borrow checker. The issue otherwise is that the lifetime (specified by the caller)
1998+ // could be bigger than lifetime of local arguments (frame, column type), and so they can't
1999+ // be borrowed for so long.
2000+ fn verify_elem_typck_err < ' meta , ' frame , T : DeserializeValue < ' frame , ' meta > + Debug > (
2001+ frame : & ' frame Bytes ,
2002+ meta : & ' meta ColumnType < ' meta > ,
2003+ ) {
2004+ let err = deserialize :: < T > ( meta, frame) . unwrap_err ( ) ;
2005+ let err = get_typeck_err ( & err) ;
2006+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <T >( ) ) ;
2007+ assert_eq ! ( err. cql_type, * meta) ;
2008+ let BuiltinTypeCheckErrorKind :: SetOrListError (
2009+ SetOrListTypeCheckErrorKind :: ElementTypeCheckFailed ( ref err) ,
2010+ ) = err. kind
2011+ else {
2012+ panic ! ( "unexpected error kind: {}" , err. kind)
2013+ } ;
2014+ let err = get_typeck_err_inner ( err. 0 . as_ref ( ) ) ;
2015+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <i64 >( ) ) ;
2016+ assert_eq ! ( err. cql_type, ColumnType :: Native ( NativeType :: Varint ) ) ;
2017+ assert_matches ! (
2018+ err. kind,
2019+ BuiltinTypeCheckErrorKind :: MismatchedType {
2020+ expected: & [ ColumnType :: Native ( NativeType :: BigInt ) ]
2021+ }
2022+ ) ;
2023+ }
2024+ verify_elem_typck_err :: < Vec < i64 > > ( & Bytes :: new ( ) , & cql_type) ;
2025+ verify_elem_typck_err :: < BTreeSet < i64 > > ( & Bytes :: new ( ) , & cql_type) ;
2026+ verify_elem_typck_err :: < HashSet < i64 > > ( & Bytes :: new ( ) , & cql_type) ;
2027+ verify_elem_typck_err :: < ListlikeIterator < i64 > > ( & Bytes :: new ( ) , & cql_type) ;
20242028}
20252029
20262030#[ test]
0 commit comments