@@ -94,6 +94,21 @@ pub fn generate(
9494 } ) ;
9595 }
9696
97+ // Generate struct files for each view
98+ for view in & schema_info. views {
99+ let ( tokens, imports) =
100+ struct_gen:: generate_struct ( view, db_kind, schema_info, extra_derives, type_overrides) ;
101+ let imports = filter_imports ( & imports, single_file) ;
102+ let code = format_tokens_with_imports ( & tokens, & imports) ;
103+ let module_name = normalize_module_name ( & view. name ) ;
104+ let origin = format ! ( "View: {}.{}" , view. schema_name, view. name) ;
105+ files. push ( GeneratedFile {
106+ filename : format ! ( "{}.rs" , module_name) ,
107+ origin : Some ( origin) ,
108+ code,
109+ } ) ;
110+ }
111+
97112 // Generate types file (enums, composites, domains)
98113 // Each item is formatted individually so we can insert blank lines between them.
99114 let mut types_blocks: Vec < String > = Vec :: new ( ) ;
@@ -680,4 +695,88 @@ mod tests {
680695 assert ! ( parse_result. is_ok( ) , "Failed to parse {}: {:?}" , f. filename, parse_result. err( ) ) ;
681696 }
682697 }
698+
699+ // ========== generate() — views ==========
700+
701+ fn make_view ( name : & str , columns : Vec < ColumnInfo > ) -> TableInfo {
702+ TableInfo {
703+ schema_name : "public" . to_string ( ) ,
704+ name : name. to_string ( ) ,
705+ columns,
706+ }
707+ }
708+
709+ #[ test]
710+ fn test_generate_one_view ( ) {
711+ let schema = SchemaInfo {
712+ views : vec ! [ make_view( "active_users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
713+ ..Default :: default ( )
714+ } ;
715+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , false ) ;
716+ assert_eq ! ( files. len( ) , 1 ) ;
717+ assert_eq ! ( files[ 0 ] . filename, "active_users.rs" ) ;
718+ }
719+
720+ #[ test]
721+ fn test_generate_view_origin ( ) {
722+ let schema = SchemaInfo {
723+ views : vec ! [ make_view( "active_users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
724+ ..Default :: default ( )
725+ } ;
726+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , false ) ;
727+ assert_eq ! ( files[ 0 ] . origin, Some ( "View: public.active_users" . to_string( ) ) ) ;
728+ }
729+
730+ #[ test]
731+ fn test_generate_tables_and_views ( ) {
732+ let schema = SchemaInfo {
733+ tables : vec ! [ make_table( "users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
734+ views : vec ! [ make_view( "active_users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
735+ ..Default :: default ( )
736+ } ;
737+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , false ) ;
738+ assert_eq ! ( files. len( ) , 2 ) ;
739+ }
740+
741+ #[ test]
742+ fn test_generate_view_valid_rust ( ) {
743+ let schema = SchemaInfo {
744+ views : vec ! [ make_view( "active_users" , vec![
745+ make_col( "id" , "int4" ) ,
746+ make_col( "name" , "text" ) ,
747+ ] ) ] ,
748+ ..Default :: default ( )
749+ } ;
750+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , false ) ;
751+ let parse_result = syn:: parse_file ( & files[ 0 ] . code ) ;
752+ assert ! ( parse_result. is_ok( ) , "Failed to parse: {:?}" , parse_result. err( ) ) ;
753+ }
754+
755+ #[ test]
756+ fn test_generate_view_nullable_column ( ) {
757+ let schema = SchemaInfo {
758+ views : vec ! [ make_view( "v" , vec![ ColumnInfo {
759+ name: "email" . to_string( ) ,
760+ data_type: "text" . to_string( ) ,
761+ udt_name: "text" . to_string( ) ,
762+ is_nullable: true ,
763+ ordinal_position: 0 ,
764+ schema_name: "public" . to_string( ) ,
765+ } ] ) ] ,
766+ ..Default :: default ( )
767+ } ;
768+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , false ) ;
769+ assert ! ( files[ 0 ] . code. contains( "Option<String>" ) ) ;
770+ }
771+
772+ #[ test]
773+ fn test_generate_view_single_file_mode ( ) {
774+ let schema = SchemaInfo {
775+ tables : vec ! [ make_table( "users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
776+ views : vec ! [ make_view( "active_users" , vec![ make_col( "id" , "int4" ) ] ) ] ,
777+ ..Default :: default ( )
778+ } ;
779+ let files = generate ( & schema, DatabaseKind :: Postgres , & [ ] , & HashMap :: new ( ) , true ) ;
780+ assert_eq ! ( files. len( ) , 2 ) ;
781+ }
683782}
0 commit comments