use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DatabaseMetadata {
pub schemas: HashMap<String, SchemaMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SchemaMetadata {
pub name: String,
pub tables: HashMap<String, TableMetadata>,
pub views: HashMap<String, ViewMetadata>,
pub enums: HashMap<String, EnumMetadata>,
pub functions: HashMap<String, FunctionMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum AxionDataType {
Text,
Integer(i32), Float(i32), Numeric,
Boolean,
Timestamp,
TimestampTz,
Date,
Time,
Bytes,
Uuid,
Json,
JsonB,
Inet,
Enum(String),
Array(Box<AxionDataType>),
Unsupported(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub struct ForeignKeyReference {
pub schema: String,
pub table: String,
pub column: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ColumnMetadata {
pub name: String,
pub sql_type_name: String,
pub axion_type: AxionDataType,
pub is_nullable: bool,
pub is_primary_key: bool,
pub default_value: Option<String>,
pub comment: Option<String>,
pub foreign_key: Option<ForeignKeyReference>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TableMetadata {
pub name: String,
pub schema: String,
pub columns: Vec<ColumnMetadata>,
pub primary_key_columns: Vec<String>,
pub comment: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ViewMetadata {
pub name: String,
pub schema: String,
pub columns: Vec<ColumnMetadata>,
pub definition: Option<String>,
pub comment: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EnumMetadata {
pub name: String,
pub schema: String,
pub values: Vec<String>,
pub comment: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum RoutineKind {
Function,
Procedure,
Aggregate,
Window,
Trigger,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum ParameterMode {
In,
Out,
InOut,
Variadic,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ParameterMetadata {
pub name: String,
pub sql_type_name: String,
pub axion_type: AxionDataType,
pub mode: ParameterMode,
pub has_default: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FunctionMetadata {
pub name: String,
pub schema: String,
pub kind: Option<RoutineKind>,
pub parameters: Vec<ParameterMetadata>,
pub return_type: Option<AxionDataType>,
pub return_table: Option<Vec<ColumnMetadata>>,
pub comment: Option<String>,
}