Skip to main content

sql_fun_core/args/
impl_metadata.rs

1use std::path::{Path, PathBuf};
2
3use crate::SqlFunArgsError;
4
5impl super::SqlFunArgs {
6    /// gets metadata format value in args
7    #[must_use]
8    pub fn metadata_format(&self) -> &str {
9        self.metadata_args.metadata_format()
10    }
11
12    /// return raw value for `--metadata-file`
13    ///
14    /// # Errors
15    ///
16    /// Returns [`SqlFunArgsError::NotSupported`] if the metadata format is not `TOML`.
17    pub fn metadata_file_raw(&self) -> Result<&str, SqlFunArgsError> {
18        self.metadata_args.metadata_file_raw()
19    }
20
21    /// search metadata file with same-owner policy
22    ///
23    /// # Errors
24    ///
25    /// Propagates errors when current directory or metadata path resolution fails.
26    pub fn metadata_file(&self) -> Result<PathBuf, SqlFunArgsError> {
27        self.metadata_args.metadata_file()
28    }
29
30    /// get schema file
31    ///
32    /// # Errors
33    ///
34    /// Returns [`SqlFunArgsError::FilePathNotFound`] when the schema file is missing.
35    pub fn schema_file(&self, metadata_file: &Path) -> Result<PathBuf, SqlFunArgsError> {
36        self.metadata_args.schema_file(metadata_file)
37    }
38}
39
40#[cfg(test)]
41mod test_metadata {
42    use std::str::FromStr;
43
44    use clap::{Parser, builder::OsStr};
45    use testresult::TestResult;
46
47    use crate::{SqlDialect, SqlFunArgs, SqlFunMetadata, metadata::EngineVersion};
48
49    #[test]
50    pub fn test_metadata_format() -> TestResult {
51        let args = SqlFunArgs::try_parse_from(vec![
52            "sqlfun",
53            "--sql-fun-home",
54            "../sql-fun-home",
55            "subcmd",
56        ])?;
57        let metadata_format = args.metadata_format();
58        assert_eq!(metadata_format, "TOML");
59        Ok(())
60    }
61
62    #[test]
63    pub fn test_metadata_file_raw() -> TestResult {
64        let args = SqlFunArgs::try_parse_from(vec![
65            "sqlfun",
66            "--sql-fun-home",
67            "../sql-fun-home",
68            "subcmd",
69        ])?;
70        let metadata_file_raw = args.metadata_file_raw()?;
71        assert_eq!(metadata_file_raw, "Cargo.toml");
72        Ok(())
73    }
74
75    #[test]
76    pub fn test_metadata_file() -> TestResult {
77        let args = SqlFunArgs::try_parse_from(vec![
78            "sqlfun",
79            "--sql-fun-home",
80            "../sql-fun-home",
81            "subcmd",
82        ])?;
83        let metadata_file = args.metadata_file()?;
84        assert_eq!(
85            metadata_file.parent().unwrap().file_stem().unwrap(),
86            OsStr::from("sql-fun-core")
87        );
88        Ok(())
89    }
90
91    #[test]
92    pub fn test_metadata_file_load() -> TestResult {
93        let args = SqlFunArgs::try_parse_from(vec![
94            "sqlfun",
95            "--sql-fun-home",
96            "../sql-fun-home",
97            "--metadata-file",
98            "test-assets/metadata.toml",
99            "subcmd",
100        ])?;
101        let metadata_file = args.metadata_file()?;
102        let metadata = SqlFunMetadata::load_from(metadata_file)?;
103        let sql_dialect = metadata.sql_dialect();
104        assert_eq!(sql_dialect, SqlDialect::PostgreSQL);
105        let engine_version = metadata.engine_version();
106        assert_eq!(engine_version, &Some(EngineVersion::from_str("17")?));
107
108        Ok(())
109    }
110}