• Eric Myhre's avatar
    schema: working to unify interfaces and dmt. Intermediate checkpoint commit. · f1859e77
    Eric Myhre authored
    This commit does not pass CI or even fully compile, and while I usually
    try to avoid those, A) I need a checkpoint!, and B) I think this one is
    interestingly illustrative, and I'll probably want to refer to this
    diff and the one that will follow it in the future as part of
    architecture design records (or even possibly experience reports about
    golang syntax).
    
    In this commit: we have three packages:
    
    - schema: full of interfaces (and only interfaces)
    - schema/compiler: creates values matching schema interfaces
    - schema/dmt: contains codegen'd types that parse schema documents.
    
    The dmt package feeds data to the compiler package, and the compiler
    package emits values matching the schema interface.
    This all works very nicely and avoids import cycles.
    
    (Avoiding import cycles has been nontrivial, here, unfortunately.
    The schema/schema2 package (which is still present in this commit,
    but will be removed shortly -- I've scraped most of it over into
    this new 'compiler' package already, just not a bunch of the validation
    rules stuff, yet) was a dream of making this all work by just having
    thin wrapper types around the dmt types.  This didn't fly...
    because codegen'd nodes comply with `schema.TypedNode`, and complying
    with `schema.TypedNode` means they have a function which references
    `schema.Type`... and that means we really must depend on that
    interface and the package it's in.  Ooof.)
    
    The big downer with this state, and why things are currently
    non-compiling at this checkpoint I've made here, is that we have to
    replicate a *lot* of methods into single-use interfaces in the schema
    package for this to work.  This belies the meaning of "interface".
    The reason we'd do this -- the reason to split 'compiler' into its own
    package -- is most because I wanted to keep all the constructor
    mechanisms for schema values out of the direct path of the user's eye,
    because most users shouldn't be using the compiler directly at all.
    
    But... I'm shifting to thinking this attempt to segregate the compiler
    details isn't worth it.  A whole separate package costs too much.
    Most concretely, it would make it impossible to make the `schema.Type`
    interface "closed" (e.g. by having an unexported method), and I think
    at that point we would be straying quite far from desired semantics.
    f1859e77
type.go 4.22 KB