diff --git a/.justfile b/.justfile index 691a92a..7e00533 100644 --- a/.justfile +++ b/.justfile @@ -1,5 +1,7 @@ set dotenv-load := true dev: - # cargo run --bin cli -- query "SELECT * FROM sources;" - cargo run --bin cli -- discover + cargo run --bin cli -- query "SELECT * FROM sources;" + +build-schema: + cargo run --bin cli -- discover -o examples/schema.toml diff --git a/example/schema.toml b/example/schema.toml deleted file mode 100644 index 2234a4e..0000000 --- a/example/schema.toml +++ /dev/null @@ -1,21 +0,0 @@ -[public] - -[public.entries] - -name = "entries" -display_name = "entries" -columns = [ - { name = "id", col_type = "Integer", default = false, not_null = true, reference = { table = "", identity = "", label = "" } }, -] - -[public.sources] - -name = "sources" -display_name = "Sources" - -[[public.sources.columns]] -name = "id" -col_type = "Integer" -default = false -not_null = true -reference = { table = "", identity = "", label = "" } diff --git a/examples/schema.toml b/examples/schema.toml new file mode 100644 index 0000000..859b151 --- /dev/null +++ b/examples/schema.toml @@ -0,0 +1,110 @@ +[public.entry_categories] +display_name = "Entry Categories" + +[[public.entry_categories.columns]] +name = "entry_id" +type = "Integer" +not_null = true +reference = { table = "entries", identity = "id", label = "Entry Id" } + +[[public.entry_categories.columns]] +name = "entry_date" +type = "Date" +not_null = true +reference = { table = "entries", identity = "id", label = "Entry Id" } + +[[public.entry_categories.columns]] +name = "category_id" +type = "Integer" +not_null = true +reference = { table = "categories", identity = "id", label = "Category Id" } + +[public.sources] +display_name = "Sources" + +[[public.sources.columns]] +name = "id" +type = "Integer" +default = "nextval('sources_id_seq'::regclass)" +not_null = true + +[[public.sources.columns]] +name = "name" +not_null = true +type = { Varchar = { length = 20 } } + +[[public.sources.columns]] +name = "uid" +not_null = true +type = { Varchar = { length = 8 } } + +[[public.sources.columns]] +name = "uri" +not_null = true +type = { Varchar = {} } + +[[public.sources.columns]] +name = "created_at" +default = "CURRENT_TIMESTAMP" +not_null = true +type = { TimestampWithTimeZone = { precision = 6 } } + +[[public.sources.columns]] +name = "updated_at" +not_null = false +type = { TimestampWithTimeZone = { precision = 6 } } + +[[public.sources.columns]] +name = "deleted_at" +not_null = false +type = { TimestampWithTimeZone = { precision = 6 } } + +[public.categories] +display_name = "Categories" + +[[public.categories.columns]] +name = "id" +type = "Integer" +default = "nextval('category_id_seq'::regclass)" +not_null = true + +[[public.categories.columns]] +name = "name" +not_null = true +type = { Varchar = { length = 20 } } + +[[public.categories.columns]] +name = "uid" +not_null = false +type = { Varchar = { length = 8 } } + +[public.entries] +display_name = "Entries" + +[[public.entries.columns]] +name = "id" +type = "Integer" +default = "nextval('entries_id_seq'::regclass)" +not_null = true + +[[public.entries.columns]] +name = "date" +type = "Date" +default = "CURRENT_TIMESTAMP" +not_null = true + +[[public.entries.columns]] +name = "source_id" +type = "Integer" +not_null = true +reference = { table = "sources", identity = "id", label = "Source Id" } + +[[public.entries.columns]] +name = "uid" +not_null = true +type = { Varchar = {} } + +[[public.entries.columns]] +name = "text" +type = "Text" +not_null = false diff --git a/src/sql.rs b/src/sql.rs index af8509f..bd52693 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -76,7 +76,14 @@ pub async fn discover_scheme( .insert(schema.schema.to_owned(), Schema::from(schema)); let mut buffer: Box = match output { - Some(path) => Box::new(File::create(Path::new(&path))?), + Some(path) => { + let path = Path::new(&path); + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + + Box::new(File::create(path)?) + } None => Box::new(io::stdout()), };