elefant-tools 0.0.2

A library for doing things like pg_dump and pg_restore, with extra features, and probably more bugs.
Documentation
use crate::object_id::HaveDependencies;
use crate::{
    ObjectId, PostgresAggregateFunction, PostgresDomain, PostgresFunction, PostgresSchema,
    PostgresTable, PostgresView,
};

pub(crate) enum PostgresThingWithDependencies<'a> {
    Table(&'a PostgresTable, &'a PostgresSchema),
    View(&'a PostgresView, &'a PostgresSchema),
    Function(&'a PostgresFunction, &'a PostgresSchema),
    AggregateFunction(&'a PostgresAggregateFunction, &'a PostgresSchema),
    Domain(&'a PostgresDomain, &'a PostgresSchema),
}

impl<'a> HaveDependencies for &PostgresThingWithDependencies<'a> {
    fn depends_on(&self) -> &Vec<ObjectId> {
        match self {
            PostgresThingWithDependencies::Table(table, _) => &table.depends_on,
            PostgresThingWithDependencies::View(view, _) => &view.depends_on,
            PostgresThingWithDependencies::Function(function, _) => &function.depends_on,
            PostgresThingWithDependencies::AggregateFunction(aggregate_function, _) => {
                &aggregate_function.depends_on
            }
            PostgresThingWithDependencies::Domain(domain, _) => &domain.depends_on,
        }
    }

    fn object_id(&self) -> ObjectId {
        match self {
            PostgresThingWithDependencies::Table(table, _) => table.object_id,
            PostgresThingWithDependencies::View(view, _) => view.object_id,
            PostgresThingWithDependencies::Function(function, _) => function.object_id,
            PostgresThingWithDependencies::AggregateFunction(aggregate_function, _) => {
                aggregate_function.object_id
            }
            PostgresThingWithDependencies::Domain(domain, _) => domain.object_id,
        }
    }
}

impl<'a> PostgresThingWithDependencies<'a> {
    pub fn get_create_sql(&self, identifier_quoter: &crate::IdentifierQuoter) -> String {
        match self {
            PostgresThingWithDependencies::Table(table, schema) => {
                table.get_create_statement(schema, identifier_quoter)
            }
            PostgresThingWithDependencies::View(view, schema) => {
                view.get_create_view_sql(schema, identifier_quoter)
            }
            PostgresThingWithDependencies::Function(function, schema) => {
                function.get_create_statement(schema, identifier_quoter)
            }
            PostgresThingWithDependencies::AggregateFunction(aggregate_function, schema) => {
                aggregate_function.get_create_statement(schema, identifier_quoter)
            }
            PostgresThingWithDependencies::Domain(domain, schema) => {
                domain.get_create_sql(schema, identifier_quoter)
            }
        }
    }
}