asdi 0.2.5

Another Simplistic Datalog Implementation (in Rust)
Documentation
@startuml

!include ../model/options.plantuml

class asdi::Program #white
hide "asdi::Program" members

class asdi::edb::RelationSet #white
hide "asdi::edb::RelationSet" members

class asdi::edb::Relation #white
hide "asdi::edb::Relation" members

class asdi::edb::Fact #white
hide "asdi::edb::Fact" members

class asdi::idb::RuleSet #white
hide "asdi::idb::RuleSet" members

class asdi::idb::Rule #white
hide "asdi::idb::Rule" members

class asdi::idb::query::QuerySet #white
hide "asdi::idb::query::QuerySet" members

class asdi::idb::query::Query #white
hide "asdi::idb::query::Query" members

namespace asdi::visitor {

    interface ProgramVisitor {
        start_program(program: &Program) : Result<()>
        end_program(program: &Program) : Result<()>

        relation_visitor(&self) : Option<&RelationVisitor>
        rule_visitor(&self) : Option<&RuleVisitor>
        query_visitor(&self) : Option<&QueryVisitor>
    }
    interface ProgramWriter
    interface RelationVisitor {
        start_relation(relation: &Relation, extensional: bool) : Result<()>
        fact(fact: &Fact) : Result<()>
        end_relation(relation: &Relation, extensional: bool) : Result<()>
    }
    interface RuleVisitor {
        start_rules(rules: &RuleSet) : Result<()>
        rule(rule: &Rule) : Result<()>
        end_rules(rule: &RuleSet) : Result<()>
    }
    interface QueryVisitor {
        start_queries(queries: &QuerySet) : Result<()>
        query(query: &Query) : Result<()>
        end_queries(queries: &QuerySet) : Result<()>
    }

    ProgramVisitor ..> RelationVisitor
    ProgramVisitor ..> RuleVisitor
    ProgramVisitor ..> QueryVisitor
    ProgramVisitor ..> asdi::Program
    ProgramVisitor ..> asdi::edb::RelationSet
    ProgramVisitor ..> asdi::idb::RuleSet
    ProgramVisitor ..> asdi::idb::query::QuerySet

    ProgramWriter --|> ProgramVisitor

    RelationVisitor ..> asdi::edb::Relation
    RelationVisitor ..> asdi::edb::Fact

    RuleVisitor ..> asdi::idb::Rule

    QueryVisitor ..> asdi::idb::query::Query

    class visitor << module >> {
        visit_program(program: &Program, visitor: &ProgramVisitor) : Result<()>
        format_program(program: &Program, visitor: &ProgramWriter) : Result<()>
    }

    visitor .left.> ProgramVisitor
    visitor .left.> ProgramWriter
    visitor ..> asdi::Program
}

@enduml