)]}'
{
  "commit": "81ebea9a2bdbc8401cfd107d59aed7c957448e06",
  "tree": "e7ee50de6cfda5540abbd5754a6db74e3b6273ee",
  "parents": [
    "12db77a887a06ca7c0ef14368ece09b9badf1081"
  ],
  "author": {
    "name": "Marcin Kowalczyk",
    "email": "qrczak@google.com",
    "time": "Tue May 12 16:04:31 2026 +0200"
  },
  "committer": {
    "name": "Marcin Kowalczyk",
    "email": "qrczak@google.com",
    "time": "Tue May 12 16:05:09 2026 +0200"
  },
  "message": "Add `{,Dynamic,Unbound}FieldSkipper()`.\n\nIt becomes increasingly common to do nothing in a field handler besides tracking\nfield presence. It is annoying to write lambdas which takes the value, context\nparameters, and just returns `absl::OkStatus()`, and it feels uncertain whether\ntaking and ignoring the value is as efficient as it could (it almost is;\narranging for this to perform varint skipping instead of varint parsing is not\nworth complicating the field handler protocol).\n\nIn contrast to `DynamicFieldCopier()`, `DynamicFieldSkipper()` field predicate\nreturns `bool` instead of `std::optional\u003cint\u003e`, because returning a destination\nfield number is not applicable.\n\nIn contrast to `AnyFieldCopier()`, `AnyFieldSkipper()` is not provided because\nskipping remaining fields is the implicit default.\n\nIn contrast to `UnboundFieldCopier()`, `UnboundFieldSkipper()` can reuse the\nimplementation of `FieldSkipper()`, because it does not need a destination field\nnumber.\n\nAlso, make public `FieldAccepted` and `FieldAcceptedIf` for dynamic field\nhandlers which carry no extra information about the field being accepted. The\nfield handler protocol requires an API which fits `std::unique_ptr` and\n`std::optional` but not `bool`. These types are extracted from a private\nimplementation detail of `DynamicFieldHandler()`. They are used by\n`DynamicFieldSkipper()` too.\n\nAlso, fix embarrassing compile errors in `FieldHandlerWrapper()` for dynamic\nfield handlers.\n\nPiperOrigin-RevId: 914263217\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "459a3ae1f7264f9d8f093ca9e341b04d1702d7c5",
      "old_mode": 33188,
      "old_path": "riegeli/messages/BUILD",
      "new_id": "90338f2e02db85a5231b25f09daefc62222b155a",
      "new_mode": 33188,
      "new_path": "riegeli/messages/BUILD"
    },
    {
      "type": "modify",
      "old_id": "7919f68604b8bc4f75aacbada992134a63086229",
      "old_mode": 33188,
      "old_path": "riegeli/messages/dynamic_field_handler.h",
      "new_id": "109387f4ba69a6222f292497e8178956aa90b63d",
      "new_mode": 33188,
      "new_path": "riegeli/messages/dynamic_field_handler.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "43307061a52c67a89baa266852896edd3fdeed88",
      "new_mode": 33188,
      "new_path": "riegeli/messages/field_skipper.h"
    },
    {
      "type": "modify",
      "old_id": "b10c89980f32a9ad0890f1b74d711f07caf870f0",
      "old_mode": 33188,
      "old_path": "riegeli/messages/fields_found.h",
      "new_id": "e846bfe932fb4edacae32bd158bb7eb925dcab27",
      "new_mode": 33188,
      "new_path": "riegeli/messages/fields_found.h"
    },
    {
      "type": "modify",
      "old_id": "510abf47be1471bfa88b81c7494a024fef9a9502",
      "old_mode": 33188,
      "old_path": "riegeli/messages/serialized_message_reader.h",
      "new_id": "9b0680197ec3bd7ab9c70553073003c3b5edf877",
      "new_mode": 33188,
      "new_path": "riegeli/messages/serialized_message_reader.h"
    }
  ]
}
