Skip to main content

ddb_core/config/
mod.rs

1// Configuration module - database, table, column definitions
2pub 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}