1. 19 Mar, 2019 1 commit
    • Eric Myhre's avatar
      Naming: ReprKind. · fe099392
      Eric Myhre authored
      Having a function called "Kind" return a "ReprKind" was inconsistent.
      
      Also, we want to introduce a "Kind" method on `typed.Node` in the future.
      
      No logical content to this change: you can safely refactor with sed.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      fe099392
  2. 16 Mar, 2019 3 commits
    • Eric Myhre's avatar
      Dag-json marshal and unmarshal. · 10442b3c
      Eric Myhre authored
      And fixes to all the encoding systems for checking lengths when they're
      provided by map and list start tokens.  Inconsistencies there are now
      errors.
      
      And some consistency changes across all the encoders to keep the diff
      of the dag-json system as minimal as possible.  (Dag-json needs to
      refer to the last handful of tokens sometimes when parsing a mapClose,
      so we keep their values outside of the loop body now.)
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      10442b3c
    • Eric Myhre's avatar
      Dag-cbor marshal/unmarshal. · a274b2db
      Eric Myhre authored
      We now have CIDs support!  You can create links backed by cids,
      and marshal them with dag-cbor; and you can unmarshal cbor data
      with dag-cbor and expect things with the CID link tag to be parsed
      into CIDs and exposed as IPLD Links.  Yay!
      
      (Dag-json is lagging.  The parse for those links is... more involved.
      When supported, it'll similarly have its own unmarshal and marshal
      just like the ones this diff introduces for dag-cbor.)
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      a274b2db
    • Eric Myhre's avatar
      Repose refactored into several packages. · 57832ad7
      Eric Myhre authored
      All of which now explicitly confess their cid-specificness.
      
      Some things in the 'repose' draft were *really* twisted; I'm glad that
      first draft is getting replaced before anything actually used it...
      
      For example, NodeBuilderChooser was just ridiculously misplaced abstraction.
      When doing a traversal, you have the local type information (if any) already
      in hand, and can just... pick an appropriate NodeBuilder already.  Now that
      the NodeBuilder is simply a parameter to Link.Load, everything shakes out
      much, much more clearly as a result.
      
      The cidlink package contains all concrete referns to Cids.  This implements
      the ipld.Link and ipld.LinkBuilder interfaces... but if you don't import
      the cidlink package in your program, you won't find any of the cid packages
      (nor their numerous transitive dependencies) in your dependency set.
      
      Multicodecs are now a registry which is confined in scope to the cidlink
      package.  (It's global, but I think in practice this will be fine: it's a
      plugin system, and there's no good cause for allowing variations in how
      those magic bytes of cids are interpreted.)
      
      There are now dagcbor and dagjson packages for encoding.  These explicitly
      refer to the cidlink package (and register themselves on package init).
      While these refer to cidlink, you could imagine we might also introduce
      other encoding packages which *don't*.
      
      Finally, note that the dagcbor and dagjson packages are in fact still not
      done.  This is the same logic/completeness they had before this diff...
      which does not include actual parsing of cids!  However, it's now clear
      where to introduce that and at what scope.  (It will probably require
      more duplication of unmarshalling code than desirable, but, alas, that
      might simply be the cost of doing business.  Dagjson in particular has
      topologically "interesting" things to handle that I'd be loathe to make
      a sufficiently pluggable unmarshal traversal to support; it would be
      possible, but likely a noticable slowdown to continuously check and
      then promptly disregard the interesting case.)
      
      Some work remains, but this is now pretty close to sanity.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      57832ad7
  3. 21 Feb, 2019 1 commit
    • Eric Myhre's avatar
      New marshal implementation! Generic. Woo! · f150a81b
      Eric Myhre authored
      We have both generic marshal and unmarshal -- they should work for any
      current or future ipld.Node implementation, and for any encoding
      mechanism that can be bridged to via refmt tokens.
      
      Tests are also updated to use builders rather than the ancient
      "mutable node" nonsense, which removes... I think nearly the last
      incident of that stuff; maybe we can remove it entirely soon.
      
      As when we moved the unmarshal code into its generic form, most of
      this code already existed and needed minor modification.  Git even
      correctly detects it as a rename this time since the diff is so small.
      And as when we moved the unmarshal code, now we also remove the
      whole PushTokens interface; we've gotten to something better now.
      
      Finally we're getting to the point we can look at wiring these up
      together with all the multicodec glue and get link loading wizardry
      at full voltage.  Yesss.  Sooon.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      f150a81b
  4. 20 Feb, 2019 1 commit
    • Eric Myhre's avatar
      New unmarshal implementation! Generic. Woo! · be01e1e5
      Eric Myhre authored
      This unmarshal works for any NodeBuilder implementation, tada!
      
      Old ipldfree.Node-specific unmarshal dropped... as well as that entire
      system of interfaces.  They were first-pass stuff, and I think now it's
      pretty clear that it was barking up the wrong tree, and we've got better
      ideas to go with now instead.  (Also, as is probably obvious from a skim,
      the old code flipped pretty clearly into the new code.)
      
      Turns out refmt tokens aren't a very relevant interface in IPLD.
      I'm still using them... internally, to wire up the CBOR and JSON
      parsers without writing those again.  But the rest of IPLD is more
      like a full-on and principled alternative to refmt/obj and all its
      reflection code, and that's... pretty great.
      
      Earlier, I had a suspicion that we would want more interfaces for token
      handling on each Node implementation directly, and in particular I
      suspected we might use those token-based interfaces for doing transcription
      features that flip data from one concrete Node implementation into another.
      (That's why we had this ipldfree.Node-specialized impl in the first place.)
      **This turns out to have been wrong!**  Instead, now that we have the
      ipld.NodeBuilder interface standard, that turns out to be much better suited
      to solving the same needs, and it can do so:
      
      - without adding tokens to the picture (simpler),
      
      - without requiring tokenization-based interfaces be implemented per
      concrete ipld.Node implementation (OH so much simpler),
      
      - and arguably NodeBuilder is even doing it *better* because it doesn't
      need to force linearization (and while usually that doesn't matter... one
      can perhaps imagine it coming up if we wanted to do a data transcription
      in memory into a Node implementation which has an orderings requirement).
      
      So yeah, this is a nice thing to have been wrong about.  Much simpler now.
      
      Old ipldfree.Node-specialized 'PushTokens' is still around.  Not for long,
      though; it just hasn't finished being ported to the new properly generalized
      style quite yet.
      
      Note, this is not the *whole* story, still, either.  For example, still
      expect to have an ipldcbor.Node which someday has a *significantly* different
      set of marshal and unmarshal methods -- it may eschew refmt entirely,
      and take the (very) different strategy of building a skiplist over raw
      byte slices! -- that will exist *in addition* to the generic implementations
      we're doing here and now.  More on that soon.
      
      Yeah.  A lot of interfaces to get lined up, here.  Some of them tug in such
      different directions that picking the right ones to make it all possible
      seems roughly like solving one of the NP-hard satisfiability problems.
      (Good thing it's actually with a small enough number of choices that it's
      tractable; on the other hand, enumerating those choices isn't fast, and
      the 'verifier' function here ain't fast either, and being a "design" thing,
      it can only be evaluated on human wetware.  So yeah, an NP problem on a
      tractable domain but slow setup and slow verifier.  Sounds about right.)
      
      (uh, I'm going to write a book "Design: It's Hard: The Novel" after this.)
      
      Tests are patched enough to keep working where they are; I think it's
      possible that a reshuffle of some of them to be more closely focused on
      the marshal code rather than the node implementation packages might be
      in order, but I'm going to let that be a future issue.  (Oh, and they
      did shine a light on one quick issue about MapBuilder initialization,
      which is also now fixed.)
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      be01e1e5