1pub mod loader;
3
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7pub use loader::{Config, DatabaseConfig, TableCatalog};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Database {
11 pub name: String,
12 pub tables: HashMap<String, Table>,
13}
14
15impl Database {
16 pub fn new(name: String) -> Self {
17 Self {
18 name,
19 tables: HashMap::new(),
20 }
21 }
22
23 pub fn add_table(&mut self, table: Table) {
24 self.tables.insert(table.name.clone(), table);
25 }
26
27 pub fn get_table(&self, name: &str) -> Option<&Table> {
28 self.tables.get(name)
29 }
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct Table {
34 pub name: String,
35 pub database: String,
36 pub data_file: String,
37 pub columns: Vec<Column>,
38 pub field_delimiter: char,
39 pub data_starts_on: usize,
40 pub comment_char: Option<char>,
41}
42
43impl Table {
44 pub fn new(name: String, database: String, data_file: String) -> Self {
45 Self {
46 name,
47 database,
48 data_file,
49 columns: Vec::new(),
50 field_delimiter: ',',
51 data_starts_on: 0,
52 comment_char: Some('#'),
53 }
54 }
55
56 pub fn add_column(&mut self, column: Column) {
57 self.columns.push(column);
58 }
59
60 pub fn get_column(&self, name: &str) -> Option<&Column> {
61 self.columns.iter().find(|c| c.name == name)
62 }
63
64 pub fn column_count(&self) -> usize {
65 self.columns.len()
66 }
67
68 pub fn get_column_index(&self, name: &str) -> Option<usize> {
69 self.columns.iter().position(|c| c.name == name)
70 }
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct Column {
75 pub name: String,
76 pub data_type: DataType,
77 pub nullable: bool,
78}
79
80impl Column {
81 pub fn new(name: String) -> Self {
82 Self {
83 name,
84 data_type: DataType::String,
85 nullable: true,
86 }
87 }
88}
89
90#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
91pub enum DataType {
92 String,
93 Integer,
94 Float,
95 Boolean,
96 Date,
97 DateTime,
98}