1. 20 Jul, 2019 1 commit
    • Eric Myhre's avatar
      Add Node.IsUndefined, ipld.Undef and ipld.Null. · 6802ea10
      Eric Myhre authored
      The comment in the ipld.Node type about IsUndefined has been there
      quite a while; today we're finally using it.
      
      With this set of changes, the generated code for structs now compiles
      successfully again: the Undef and Null thunks are both used there.
      6802ea10
  2. 21 Mar, 2019 1 commit
    • Eric Myhre's avatar
      Iterator refactor: entry-based, for map and list. · b84e99cd
      Eric Myhre authored
      We now have both MapIterator and ListIterator interfaces.
      Both return key-value (or index-value) pairs, rather than just keys.
      
      List iterators may seem a tad redundant: you just loop over the length,
      right?  Well, sure.  But there's one place a list iterator shines:
      selecting only a subset of elements.  And indeed, we'll be doing
      exactly that in the traversal/selector package; therefore, we
      definitely need list iterators.
      
      We might want keys-only iterators again in the future, but at present,
      I'm deferring that.  It's definitely true that we should have iterators
      returning values as a core feature, since they're likely to be more
      efficiently supportable than "random" access (especially when we get to
      some Advanced Layout data systems), so we'll implement those first.
      
      Additionally, note that MapIterator now returns a Node for the key.
      This is to account for that fact that when using the schema system and
      typed nodes, map keys can be more *specific* types.  Such nodes are
      still required to be kind==ReprKind_String, but string might not be
      their *preferred* native format (think: tuples with serialized to be
      delimiter-separated strings); we need to account for that.
      (MapBuilder.Insert method already takes a Node parameter for similar
      reasons: so it can take *typed* nodes.  Node.TraverseField accepting
      a plain string is the oddball out here, and should be rectified.)
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      b84e99cd
  3. 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
  4. 16 Mar, 2019 2 commits
    • Eric Myhre's avatar
      Add NodeBuilder to Node interface. · 025fcf8a
      Eric Myhre authored
      (... offically.  Lots of docs have probably already been stating that
      this is there.  Now it actually... is.)
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      025fcf8a
    • Eric Myhre's avatar
      Update Node interfaces to use Link instead of CID. · 694c6f3c
      Eric Myhre authored
      As detailed in comments a few commits ago, this is part of a big, big
      roll towards keeping linking details far enough off to one side that
      one can actually use most of the IPLD system without forming an
      explicit compile-time dependency on any linking features (until, of
      course, one uses the linking features).
      
      This is a surprisingly small diff, because... well, because most of
      the *interesting* features around linking simply weren't implemented
      yet, and at this point everything that is has already been isolated
      in the new cidlink and related encoding packages.
      "CID" was *already* just a semantic placeholder that meant "eh, link".
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      694c6f3c
  5. 05 Feb, 2019 1 commit
    • Eric Myhre's avatar
      Node.Keys method now returns iterators. · 5c3bd1af
      Eric Myhre authored
      An "immediate" rather than generative function is also available;
      the docs contain caveats.
      
      At the moment, these distinctions are a bit forced, but we want to be
      ready for when we start getting truly huge maps where the generative
      usage actually *matters* for either memory reasons, latency reasons,
      or both.
      
      Separated Length rather than trying to pull double-duty the Keys
      method; the previous combination was just utterly silly.
      
      The implementations in the bind package are stubs; that package is
      going to take a lot of work, and so the focus is going to be entirely
      on keeping the 'free' package viable; and we'll revisit bind and such
      when there's more dev time budget.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      5c3bd1af
  6. 08 Jan, 2019 1 commit
  7. 08 Dec, 2018 1 commit
    • Eric Myhre's avatar
      Begin schema validation method. · b66f9261
      Eric Myhre authored
      This will be for the active path -- if we also follow through on the
      idea of having a just-in-time checked Node wrapper, a lot of these
      checks might end up duplicated.  We'll DRY that up when we get there.
      
      Doing accumulation of errors.  Might get loud.  We can come back and
      and early-halt parameters or other accumulation strategies later.
      
      Added IsNull predicate to core Node interface.
      
      Going to want enumerated error categories here for sure, but punting
      on that until we get more examples of what all the errors *are*; then
      I'll come back and tear all this 'fmt.Errorf' nonsense back out.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      b66f9261
  8. 06 Dec, 2018 1 commit
    • Eric Myhre's avatar
      Add Kind and Keys methods to Node. · 5c32434e
      Eric Myhre authored
      And ReprKind moves from the typed package to the ipld main package.
      It's hard to get too much done without the standardization of ReprKind.
      
      Between the Kind() and Keys() methods, it should now be possible to
      perform traversals of unknown nodes.
      
      This diff just worries about implementing all the Kind() methods.
      Keys() has some additional questions to handle (namely, map ordering?).
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      5c32434e
  9. 21 Oct, 2018 2 commits
    • Eric Myhre's avatar
      Node for all. Last phase deref. · 34a8b3c7
      Eric Myhre authored
      Finally got the bind and free impls on the same page.
      
      Surprisingly, the bind node can work without being a ptr itself.
      I'm not sure if that'll last, but let's try to roll with it.
      If we *can* keep that property, it might reduce GC impact in a pretty
      significant way.
      
      Added a 'fluent' package.  It's just a twinkle in my eye so far, but it
      might represent the nicest way through all the discussed issues.
      Nodes shouldn't have to be panicful; and users shouldn't have to do all
      error handling manually either.  A package full of fluent interfaces
      that know what's going on seems to be the only way to get both.
      But we'll see how this shakes out.  Maybe typeful traversers will
      make the whole thing end up more coreward than being relegated to a
      helper package.  I have no idea.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      34a8b3c7
    • Eric Myhre's avatar
      Switch to single-step deref'ering methods. · c35f4393
      Eric Myhre authored
      And add a bunch of type-specific ones for helpfulness.
      
      But immediately re-reviewing this further.  What we've done here is
      handle leafs very oddly, because it would seem to avoid unnecessary
      wrapping on the leaf nodes.  But the result seems to be much uglier
      code than it needs to be, and implies that we've got all sorts of
      additional special cases required to either handle or reject binds
      of primitive-kind fields.  And that seems... maybe not a great trade.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      c35f4393
  10. 19 Oct, 2018 1 commit
    • Eric Myhre's avatar
      Bit 'o flesh for the bindnode impl. · 21a9fa21
      Eric Myhre authored
      This has been sitting on my hard drive quite a while already, so I
      decided to clean it up juuuust enough that it compiles so I can push
      it.  But as you can see, there's a LOT of TODOs dangling here.
      
      I'm not at all still sure those comments about "root node" in the
      interface are going to stand up to scrutiny over time.  There's
      definitely going to be some distinction between "Node we're traversing"
      and "Node we are putting in a serialized block of bytes and can
      think it's reasonable to address by hash", but figuring out the best
      ergonomics of that is probably going to take a while.
      
      I'm going to start on another simpler just-backed-by-maps-n-stuff Node
      impl before going deeper with this one, because I suspect it'll make
      tests easier to write, which will then make this whole pile of
      reflection easier to test down the road as well.
      Signed-off-by: default avatarEric Myhre <hash@exultant.us>
      21a9fa21
  11. 29 Aug, 2018 1 commit
    • Eric Myhre's avatar
      Five minutes in: not all nodes are serializable. · 80386cb8
      Eric Myhre authored
      Hopefully if we come up with a good way to flip one node impl into another,
      we'll be able to come up with an easy interface for "this is referencing
      an in-memory structure type of mine, but hashed as CBOR native standard".
      80386cb8