@@ -7,12 +7,47 @@ use chrono::{
7
7
DateTime ,
8
8
Utc ,
9
9
} ;
10
- use common:: value:: ConvexObject ;
10
+ use common:: value:: {
11
+ ConvexObject ,
12
+ FieldPath ,
13
+ IdentifierFieldName ,
14
+ } ;
11
15
use serde:: {
12
16
Deserialize ,
13
17
Serialize ,
14
18
} ;
15
19
20
+ use crate :: constants:: {
21
+ ID_FIELD_PATH ,
22
+ ID_FIVETRAN_FIELD_NAME ,
23
+ SOFT_DELETE_FIELD_PATH ,
24
+ SOFT_DELETE_FIVETRAN_FIELD_NAME ,
25
+ SYNCED_FIELD_PATH ,
26
+ SYNCED_FIVETRAN_FIELD_NAME ,
27
+ } ;
28
+
29
+ #[ derive(
30
+ Hash , Eq , PartialEq , derive_more:: Display , Debug , serde:: Deserialize , Clone , PartialOrd , Ord ,
31
+ ) ]
32
+ #[ serde( transparent) ]
33
+ pub struct FivetranTableName ( String ) ;
34
+
35
+ impl FromStr for FivetranTableName {
36
+ type Err = anyhow:: Error ;
37
+
38
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
39
+ Ok ( Self ( s. to_owned ( ) ) )
40
+ }
41
+ }
42
+
43
+ impl Deref for FivetranTableName {
44
+ type Target = str ;
45
+
46
+ fn deref ( & self ) -> & str {
47
+ & self . 0 [ ..]
48
+ }
49
+ }
50
+
16
51
#[ derive(
17
52
Hash , Eq , PartialEq , derive_more:: Display , Debug , serde:: Deserialize , Clone , PartialOrd , Ord ,
18
53
) ]
@@ -35,6 +70,23 @@ impl Deref for FivetranFieldName {
35
70
}
36
71
}
37
72
73
+ impl TryInto < FieldPath > for FivetranFieldName {
74
+ type Error = anyhow:: Error ;
75
+
76
+ fn try_into ( self ) -> Result < FieldPath , Self :: Error > {
77
+ Ok ( if & self == SYNCED_FIVETRAN_FIELD_NAME . deref ( ) {
78
+ SYNCED_FIELD_PATH . clone ( )
79
+ } else if & self == SOFT_DELETE_FIVETRAN_FIELD_NAME . deref ( ) {
80
+ SOFT_DELETE_FIELD_PATH . clone ( )
81
+ } else if & self == ID_FIVETRAN_FIELD_NAME . deref ( ) {
82
+ ID_FIELD_PATH . clone ( )
83
+ } else {
84
+ let field = IdentifierFieldName :: from_str ( & self ) ?;
85
+ FieldPath :: for_root_field ( field)
86
+ } )
87
+ }
88
+ }
89
+
38
90
#[ derive( Debug , Clone , Copy , Serialize , Deserialize ) ]
39
91
pub enum BatchWriteOperation {
40
92
Upsert ,
@@ -62,3 +114,42 @@ pub struct TruncateTableArgs {
62
114
pub delete_before : Option < DateTime < Utc > > ,
63
115
pub delete_type : DeleteType ,
64
116
}
117
+
118
+ #[ cfg( test) ]
119
+ mod tests {
120
+ use std:: str:: FromStr ;
121
+
122
+ use common:: value:: FieldPath ;
123
+
124
+ use crate :: api_types:: FivetranFieldName ;
125
+
126
+ #[ test]
127
+ fn convert_fivetran_user_fields_to_field_path ( ) {
128
+ let expected: FieldPath = FivetranFieldName :: from_str ( "name" )
129
+ . unwrap ( )
130
+ . try_into ( )
131
+ . unwrap ( ) ;
132
+ assert_eq ! ( expected, FieldPath :: from_str( "name" ) . unwrap( ) ) ;
133
+ }
134
+
135
+ #[ test]
136
+ fn convert_fivetran_metadata_fields_to_field_path ( ) {
137
+ let expected: FieldPath = FivetranFieldName :: from_str ( "_fivetran_synced" )
138
+ . unwrap ( )
139
+ . try_into ( )
140
+ . unwrap ( ) ;
141
+ assert_eq ! ( expected, FieldPath :: from_str( "fivetran.synced" ) . unwrap( ) ) ;
142
+
143
+ let expected: FieldPath = FivetranFieldName :: from_str ( "_fivetran_id" )
144
+ . unwrap ( )
145
+ . try_into ( )
146
+ . unwrap ( ) ;
147
+ assert_eq ! ( expected, FieldPath :: from_str( "fivetran.id" ) . unwrap( ) ) ;
148
+
149
+ let expected: FieldPath = FivetranFieldName :: from_str ( "_fivetran_deleted" )
150
+ . unwrap ( )
151
+ . try_into ( )
152
+ . unwrap ( ) ;
153
+ assert_eq ! ( expected, FieldPath :: from_str( "fivetran.deleted" ) . unwrap( ) ) ;
154
+ }
155
+ }
0 commit comments