Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
Loading...
Searching...
No Matches
connector.hpp
Go to the documentation of this file.
1#pragma once
2#include <algorithm>
3#include <cstdint>
4#include <map>
5#include <ranges>
6#include <string>
7#include <utility>
8#include <vector>
9
10#include <absl/hash/hash.h>
11
12#include "connector.pb.h"
13
14#include "parser.hpp"
15#include "chain.hpp"
16
17namespace dcn
18{
19 template <typename H>
20 inline H AbslHashValue(H h, const TransformationDef & td)
21 {
22 h = H::combine(std::move(h), td.name());
23 for(const int32_t & arg : td.args())
24 {
25 h = H::combine(std::move(h), arg);
26 }
27 return h;
28 }
29
30 template <typename H>
31 inline H AbslHashValue(H h, const Dimension & d)
32 {
33 h = H::combine(std::move(h), d.composite());
34
35 std::vector<std::pair<std::string, std::string>> sorted_bindings;
36 sorted_bindings.reserve(static_cast<std::size_t>(d.bindings_size()));
37 for(const auto & [slot, composite] : d.bindings())
38 {
39 sorted_bindings.emplace_back(slot, composite);
40 }
41 std::ranges::sort(sorted_bindings, [](const auto & lhs, const auto & rhs)
42 {
43 return lhs.first < rhs.first;
44 });
45
46 for(const auto & [slot, composite] : sorted_bindings)
47 {
48 h = H::combine(std::move(h), slot, composite);
49 }
50
51 for(const TransformationDef & t : d.transformations())
52 {
53 h = H::combine(std::move(h), t);
54 }
55 return h;
56 }
57
58 template <typename H>
59 inline H AbslHashValue(H h, const Connector & p)
60 {
61 h = H::combine(std::move(h), p.name());
62
63 for(const Dimension & d : p.dimensions())
64 {
65 h = H::combine(std::move(h), d);
66 }
67
68 h = H::combine(std::move(h), p.condition_name());
69 for(const auto & arg : p.condition_args())
70 {
71 h = H::combine(std::move(h), arg);
72 }
73 return h;
74 }
75
77}
78
79namespace dcn::pt
80{
82 {
85 std::string name;
87 std::uint32_t dimensions_count{};
88 std::map<std::uint32_t, std::string> composites;
89 std::map<std::pair<std::uint32_t, std::uint32_t>, std::string> bindings;
90 std::string condition_name;
91 std::vector<std::int32_t> condition_args;
92 evmc::bytes32 format_hash{};
93 // Static running instances keyed by local position id -> {start_point, transformation_shift}.
94 std::map<std::uint32_t, std::pair<std::uint32_t, std::uint32_t>> static_ri;
95 // Per-dimension transformation defs, reconstructed from the log (key = dim id, value ordered as emitted).
96 std::map<std::uint32_t, std::vector<TransformationDef>> transformations;
97 };
98
99 std::optional<ConnectorAddedEvent> decodeConnectorAddedEvent(
100 const std::uint8_t* data,
101 std::size_t data_size,
102 const evmc::bytes32 topics[],
103 std::size_t num_topics);
104
105 std::optional<ConnectorAddedEvent> decodeConnectorAddedEvent(
106 const std::string & data_hex,
107 const std::vector<std::string> & topics_hex);
108
109 // Reconstruct a full ConnectorRecord from a decoded ConnectorAdded event.
110 // Maps name, owner (hex), dims (transformations + composite + bindings),
111 // condition name/args, and static_ri back into the Connector proto.
112 ConnectorRecord buildConnectorRecordFromEvent(const ConnectorAddedEvent & event);
113}
114
115namespace dcn::parse
116{
117 template<>
118 Result<json> parseToJson(TransformationDef transform_def, use_json_t);
119
120 template<>
121 Result<TransformationDef> parseFromJson(json json_obj, use_json_t);
122
123 template<>
124 Result<json> parseToJson(Dimension dimension, use_json_t);
125
126 template<>
127 Result<Dimension> parseFromJson(json json_obj, use_json_t);
128
129 template<>
130 Result<std::string> parseToJson(Dimension dimension, use_protobuf_t);
131
132 template<>
133 Result<Dimension> parseFromJson(std::string json_str, use_protobuf_t);
134
135 template<>
136 Result<json> parseToJson(Connector connector, use_json_t);
137
138 template<>
139 Result<Connector> parseFromJson(json json_obj, use_json_t);
140
141 template<>
142 Result<std::string> parseToJson(Connector connector, use_protobuf_t);
143
144 template<>
145 Result<Connector> parseFromJson(std::string json_str, use_protobuf_t);
146
147 template<>
148 Result<json> parseToJson(ConnectorRecord connector_record, use_json_t);
149
150 template<>
151 Result<std::string> parseToJson(ConnectorRecord connector_record, use_protobuf_t);
152
153 template<>
154 Result<ConnectorRecord> parseFromJson(json json_obj, use_json_t);
155
156 template<>
157 Result<ConnectorRecord> parseFromJson(std::string json_str, use_protobuf_t);
158}
evmc::address Address
Definition address.hpp:18
Definition hex.hpp:28
Result< json > parseToJson(T message, use_json_t)
Converts a T to a JSON object using JSON.
Result< T > parseFromJson(json json, use_json_t)
Converts a JSON string to a T using JSON.
std::expected< T, ParseError > Result
Definition parse_error.hpp:26
Definition condition.hpp:40
ConnectorRecord buildConnectorRecordFromEvent(const ConnectorAddedEvent &event)
Definition connector.cpp:674
std::optional< ConnectorAddedEvent > decodeConnectorAddedEvent(const std::uint8_t *data, std::size_t data_size, const evmc::bytes32 topics[], std::size_t num_topics)
Definition connector.cpp:456
Definition decentralised_art.hpp:35
parse::Result< std::string > constructConnectorSolidityCode(const Connector &connector)
Definition connector.cpp:71
H AbslHashValue(H h, const Condition &c)
Combines hash values for a Condition object.
Definition condition.hpp:25
nlohmann::json json
Definition parser.hpp:7
Definition connector.hpp:82
std::map< std::uint32_t, std::pair< std::uint32_t, std::uint32_t > > static_ri
Definition connector.hpp:94
std::map< std::pair< std::uint32_t, std::uint32_t >, std::string > bindings
Definition connector.hpp:89
std::vector< std::int32_t > condition_args
Definition connector.hpp:91
std::map< std::uint32_t, std::vector< TransformationDef > > transformations
Definition connector.hpp:96
std::map< std::uint32_t, std::string > composites
Definition connector.hpp:88
chain::Address caller
Definition connector.hpp:83
evmc::bytes32 format_hash
Definition connector.hpp:92
std::string name
Definition connector.hpp:85
chain::Address owner
Definition connector.hpp:84
chain::Address connector_address
Definition connector.hpp:86
std::string condition_name
Definition connector.hpp:90
std::uint32_t dimensions_count
Definition connector.hpp:87