Logo
ApraPipes 1.0
Loading...
Searching...
No Matches
PipelineDescription.h
1// ============================================================
2// File: declarative/PipelineDescription.h
3// Pipeline Description Intermediate Representation
4// Task B1: Pipeline Description IR
5// ============================================================
6
7#pragma once
8
9#include <string>
10#include <string_view>
11#include <vector>
12#include <map>
13#include <variant>
14#include <optional>
15
16namespace apra {
17
18// ============================================================
19// PropertyValue - Variant type for pipeline configuration values
20// Extended with array types for TOML/YAML/JSON parsing
21// ============================================================
22using PropertyValue = std::variant<
23 int64_t,
24 double,
25 bool,
26 std::string,
27 std::vector<int64_t>,
28 std::vector<double>,
29 std::vector<std::string>
30>;
31
32// ============================================================
33// ModuleInstance - A module instance in the pipeline
34// ============================================================
36 std::string instance_id; // User-defined: "my_decoder"
37 std::string module_type; // Registry name: "H264DecoderNvCodec"
38 std::map<std::string, PropertyValue> properties;
39
40 // Source location for error messages
41 int source_line = -1;
42 int source_column = -1;
43};
44
45// ============================================================
46// Connection - Links output pin to input pin
47// ============================================================
48struct Connection {
49 std::string from_module; // "source"
50 std::string from_pin; // "output"
51 std::string to_module; // "decoder"
52 std::string to_pin; // "input"
53
54 // Sieve mode: when true, only explicit output pins are connected.
55 // When false, input pins also pass through to the next module.
56 // When not set (nullopt), uses Module::setNext() C++ default (sieve=true).
57 // This affects transform modules - with sieve=false, the input frame
58 // is forwarded along with any new output frames the module creates.
59 std::optional<bool> sieve; // nullopt = use C++ API default
60
61 // Source location for error messages
62 int source_line = -1;
63 int source_column = -1;
64
65 // Helper to parse "module.pin" format
66 // Returns empty strings on parse error
67 static Connection parse(const std::string& from, const std::string& to);
68
69 // Check if connection is valid (all fields non-empty)
70 bool isValid() const;
71};
72
73// ============================================================
74// PipelineSettings - Global pipeline configuration
75// ============================================================
77 std::string name;
78 std::string version = "1.0";
79 std::string description;
80
81 int queue_size = 10;
82 std::string on_error = "restart_module"; // "stop_pipeline" | "skip_frame"
83 bool auto_start = false;
84};
85
86// ============================================================
87// PipelineDescription - Complete pipeline definition
88// This is what parsers produce and validators consume
89// ============================================================
92 std::vector<ModuleInstance> modules;
93 std::vector<Connection> connections;
94
95 // Source tracking for error messages
96 std::string source_format; // "toml", "yaml", "json", "programmatic"
97 std::string source_path; // File path or "<inline>"
98
99 // ========================================================
100 // Helpers
101 // ========================================================
102
103 // Find module by instance_id, returns nullptr if not found
104 const ModuleInstance* findModule(const std::string& id) const;
105 ModuleInstance* findModule(const std::string& id);
106
107 // Add a module instance
108 void addModule(ModuleInstance module);
109
110 // Add a connection
111 void addConnection(Connection conn);
112
113 // Add connection using "module.pin" syntax
114 // Returns false if parsing fails
115 bool addConnection(const std::string& from, const std::string& to);
116
117 // Check if description is empty (no modules or connections)
118 bool isEmpty() const;
119
120 // Serialize to JSON (for debugging)
121 std::string toJson() const;
122};
123
124// ============================================================
125// Helper: Get property as specific type with default value
126// ============================================================
127template<typename T>
128T getProperty(const std::map<std::string, PropertyValue>& props,
129 const std::string& key,
130 const T& defaultValue) {
131 auto it = props.find(key);
132 if (it == props.end()) {
133 return defaultValue;
134 }
135 try {
136 return std::get<T>(it->second);
137 } catch (const std::bad_variant_access&) {
138 return defaultValue;
139 }
140}
141
142// ============================================================
143// Helper: Convert PropertyValue to string for display
144// ============================================================
145std::string propertyValueToString(const PropertyValue& value);
146
147} // namespace apra
Definition FrameTypeRegistrations.h:10
T getProperty(const std::map< std::string, PropertyValue > &props, const std::string &key, const T &defaultValue)
Definition PipelineDescription.h:128
std::variant< int64_t, double, bool, std::string, std::vector< int64_t >, std::vector< double >, std::vector< std::string > > PropertyValue
Definition PipelineDescription.h:22
std::string propertyValueToString(const PropertyValue &value)
Definition PipelineDescription.cpp:114
Definition PipelineDescription.h:48
int source_line
Definition PipelineDescription.h:62
std::string from_module
Definition PipelineDescription.h:49
int source_column
Definition PipelineDescription.h:63
std::optional< bool > sieve
Definition PipelineDescription.h:59
bool isValid() const
Definition PipelineDescription.cpp:44
std::string from_pin
Definition PipelineDescription.h:50
std::string to_module
Definition PipelineDescription.h:51
static Connection parse(const std::string &from, const std::string &to)
Definition PipelineDescription.cpp:17
std::string to_pin
Definition PipelineDescription.h:52
Definition PipelineDescription.h:35
std::string instance_id
Definition PipelineDescription.h:36
std::string module_type
Definition PipelineDescription.h:37
int source_column
Definition PipelineDescription.h:42
int source_line
Definition PipelineDescription.h:41
std::map< std::string, PropertyValue > properties
Definition PipelineDescription.h:38
Definition PipelineDescription.h:90
std::string source_path
Definition PipelineDescription.h:97
std::vector< Connection > connections
Definition PipelineDescription.h:93
std::string toJson() const
Definition PipelineDescription.cpp:157
bool isEmpty() const
Definition PipelineDescription.cpp:81
std::string source_format
Definition PipelineDescription.h:96
std::vector< ModuleInstance > modules
Definition PipelineDescription.h:92
const ModuleInstance * findModule(const std::string &id) const
Definition PipelineDescription.cpp:52
void addConnection(Connection conn)
Definition PipelineDescription.cpp:68
PipelineSettings settings
Definition PipelineDescription.h:91
void addModule(ModuleInstance module)
Definition PipelineDescription.cpp:64
Definition PipelineDescription.h:76
std::string on_error
Definition PipelineDescription.h:82
bool auto_start
Definition PipelineDescription.h:83
std::string version
Definition PipelineDescription.h:78
std::string description
Definition PipelineDescription.h:79
int queue_size
Definition PipelineDescription.h:81
std::string name
Definition PipelineDescription.h:77