13#include <commons/ability.hpp>
14#include <commons/json/ability.hpp>
37 using storage_t = comms::AbilityPtr;
39 static constexpr std::string_view kind_id =
"ability";
49 return std::make_shared<AbilityCell>(std::move(v));
52 [[nodiscard]] std::string_view
kind()
const override {
60 [[nodiscard]] std::string
to_string()
const override {
61 return value ? std::string{
value->kind()} : std::string{
"null"};
73 auto c = std::make_shared<AbilityCell>(
value ?
value->clone() : comms::AbilityPtr{});
74 c->display_info_ = display_info_;
78 [[nodiscard]] std::partial_ordering
compare(
ICell const& other)
const override {
79 if (
const auto k_cmp = this->
kind() <=> other.
kind(); k_cmp != 0) {
82 const auto* o =
dynamic_cast<AbilityCell const*
>(&other);
84 return std::partial_ordering::unordered;
87 : std::partial_ordering::unordered;
94 const auto it_kind = j.find(
KEY_KIND);
95 if (it_kind == j.end() || !it_kind->is_string()) {
96 throw InvalidJsonException(
"Missing or invalid 'k' field in ICell JSON",
97 std::string(kind_id));
99 if (
const auto k = it_kind->get<std::string_view>(); k != kind_id) {
100 throw KindMismatchException(
"Unexpected kind in ICell JSON: expected '" +
101 std::string(kind_id) +
"', got '" + std::string(k) +
103 std::string(kind_id));
106 if (it_value == j.end()) {
107 throw InvalidJsonException(
"Missing 'v' field in ICell JSON", std::string(kind_id));
110 auto cell = std::make_shared<AbilityCell>(it_value->get<comms::AbilityPtr>());
112 cell->set_display_info(it_d->get<DisplayInfo>());
118 static const auto d = std::make_shared<SimpleCellTypeDescriptor<AbilityCell>>(
DisplayInfo{
120 .description =
"Polymorphic \"what is allowed\" envelope ({\"kind\", …fields} on the "
127 display_info_ = std::move(m);
131 std::optional<DisplayInfo> display_info_;
Core ICell interface, cell_t handle, BaseCell CRTP base, and CellLike concept.
std::shared_ptr< ICellTypeDescriptor > cell_type_descriptor_t
Shared handle to a runtime cell-type descriptor.
Definition cell.h:63
std::shared_ptr< ICell > cell_t
Shared handle to any ICell-derived value — the canonical cell pointer.
Definition cell.h:68
Cell wrapping comms::AbilityPtr (a std::unique_ptr<comms::IAbility>).
Definition ability.h:35
std::string to_string() const override
Render the cell's value as a compact human-readable string.
Definition ability.h:60
std::string_view kind() const override
Wire-stable kind identifier for this cell.
Definition ability.h:52
std::partial_ordering compare(ICell const &other) const override
Three-way compare against another cell.
Definition ability.h:78
json_t to_json() const override
Serialize this cell to its canonical JSON representation.
Definition ability.h:64
static cell_t of(comms::AbilityPtr v)
Construct a shared_ptr<AbilityCell> owning v.
Definition ability.h:48
cell_t clone() const override
Deep-copy this cell.
Definition ability.h:72
comms::AbilityPtr value
Held ability (may be null).
Definition ability.h:42
std::optional< DisplayInfo > const & overridden_display_info() const override
Read-only access to this cell's optional display info.
Definition ability.h:56
void set_display_info(std::optional< DisplayInfo > m) override
Replace this cell's display info in place.
Definition ability.h:126
JSON shape was wrong (missing/non-string k, missing v, etc.).
Definition error.h:158
Runtime catalog of cell-type descriptors, keyed by wire kind id.
Definition registry.h:115
comms::DisplayInfo DisplayInfo
Display info attached to a cell or descriptor — re-exported from comms::DisplayInfo.
Definition common.h:75
The default_cell_for<T> trait that drives FieldsBuilder field-type inference.
#define PARCEL_DEFAULT_CELL(CellT)
Register a cell type as the default wrapper for its payload type.
Definition defaults.h:269
auto cell(T &&v)
Wrap a raw value into its default cell, returning a shared_ptr to the cell.
Definition defaults.h:192
Runtime cell-type descriptors and the schema-graph mix-ins (IHasFields, ISubTypes).
nlohmann::json typedef shared across cell types.
nlohmann::json json_t
Project-wide alias for nlohmann::json.
Definition json.h:19
Polymorphic root of every parcel cell.
Definition cell.h:84
static constexpr std::string_view KEY_DESCRIPTION
JSON key for the optional display info block ("d").
Definition cell.h:90
static constexpr std::string_view KEY_VALUE
JSON key for the value payload ("v").
Definition cell.h:88
virtual std::string_view kind() const =0
Wire-stable kind identifier for this cell.
static constexpr std::string_view KEY_KIND
JSON key for the kind id ("k").
Definition cell.h:86