1+ use std:: error:: Error ;
12/*
23 * Licensed to the Apache Software Foundation (ASF) under one
34 * or more contributor license agreements. See the NOTICE file
1718 * under the License.
1819 */
1920use std:: fmt:: Display ;
21+ use std:: str:: FromStr ;
2022use std:: sync:: Arc ;
2123
2224#[ cfg( not( feature = "python-binding" ) ) ]
@@ -99,6 +101,32 @@ mod manifest_impl {
99101
100102pub use crate :: mdl:: manifest:: manifest_impl:: * ;
101103
104+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
105+ pub struct ParsedDataSourceError {
106+ pub message : String ,
107+ }
108+
109+ impl ParsedDataSourceError {
110+ pub fn new ( msg : & str ) -> ParsedDataSourceError {
111+ ParsedDataSourceError {
112+ message : msg. to_string ( ) ,
113+ }
114+ }
115+ }
116+
117+ impl Display for ParsedDataSourceError {
118+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
119+ write ! ( f, "ParsedDataSourceError: {}" , self . message)
120+ }
121+ }
122+
123+ impl Error for ParsedDataSourceError {
124+ #[ allow( deprecated) ]
125+ fn description ( & self ) -> & str {
126+ & self . message
127+ }
128+ }
129+
102130impl Display for DataSource {
103131 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
104132 match self {
@@ -124,6 +152,37 @@ impl Display for DataSource {
124152 }
125153}
126154
155+ impl FromStr for DataSource {
156+ type Err = ParsedDataSourceError ;
157+
158+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
159+ match s. to_uppercase ( ) . as_str ( ) {
160+ "BIGQUERY" => Ok ( DataSource :: BigQuery ) ,
161+ "CLICKHOUSE" => Ok ( DataSource :: Clickhouse ) ,
162+ "CANNER" => Ok ( DataSource :: Canner ) ,
163+ "TRINO" => Ok ( DataSource :: Trino ) ,
164+ "MSSQL" => Ok ( DataSource :: MSSQL ) ,
165+ "MYSQL" => Ok ( DataSource :: MySQL ) ,
166+ "POSTGRES" => Ok ( DataSource :: Postgres ) ,
167+ "SNOWFLAKE" => Ok ( DataSource :: Snowflake ) ,
168+ "DATAFUSION" => Ok ( DataSource :: Datafusion ) ,
169+ "DUCKDB" => Ok ( DataSource :: DuckDB ) ,
170+ "LOCAL_FILE" => Ok ( DataSource :: LocalFile ) ,
171+ "S3_FILE" => Ok ( DataSource :: S3File ) ,
172+ "GCS_FILE" => Ok ( DataSource :: GcsFile ) ,
173+ "MINIO_FILE" => Ok ( DataSource :: MinioFile ) ,
174+ "ORACLE" => Ok ( DataSource :: Oracle ) ,
175+ "ATHENA" => Ok ( DataSource :: Athena ) ,
176+ "REDSHIFT" => Ok ( DataSource :: Redshift ) ,
177+ "DATABRICKS" => Ok ( DataSource :: Databricks ) ,
178+ _ => Err ( ParsedDataSourceError :: new ( & format ! (
179+ "Unknown data source: {}" ,
180+ s
181+ ) ) ) ,
182+ }
183+ }
184+ }
185+
127186mod table_reference {
128187 use serde:: { self , Deserialize , Deserializer , Serialize , Serializer } ;
129188
@@ -260,7 +319,7 @@ impl Model {
260319 self . columns
261320 . iter ( )
262321 . filter ( |c| c. relationship . is_none ( ) )
263- . map ( |c| Arc :: clone ( & c ) )
322+ . map ( Arc :: clone)
264323 . collect ( )
265324 }
266325 }
@@ -286,7 +345,7 @@ impl Model {
286345 self . columns
287346 . iter ( )
288347 . find ( |c| c. name == column_name)
289- . map ( |c| Arc :: clone ( & c ) )
348+ . map ( Arc :: clone)
290349 }
291350
292351 /// Return the primary key of the model
0 commit comments