1#[cfg(feature = "metadata")]
2use super::schema::NodeSchema;
3use super::{
4 Node, OutputPortDef, PortRef, PropertyEval, PropertyExpression, compositing, ids::NodeId,
5 media_output, ports::SINGLE_RASTER_OUTPUT, processing, source, vector,
6};
7
8#[derive(Debug)]
9#[allow(clippy::large_enum_variant)]
10pub enum NodeKind {
11 MediaIn(source::media_in::MediaIn),
12 Background(source::background::Background),
13 Text(source::text::Text),
14 Path(vector::path::Path),
15 Shape(vector::shape::Shape),
16 Boolean(compositing::boolean::Boolean),
17 Merge(compositing::merge::Merge),
18 RasterMultiMerge(compositing::raster_multimerge::RasterMultiMerge),
19 AlphaPremultiply(processing::alpha_premultiply::AlphaPremultiply),
20 Blur(processing::blur::Blur),
21 ChannelShuffle(processing::channel_shuffle::ChannelShuffle),
22 ColorGrade(processing::color_grade::ColorGrade),
23 Curves(processing::curves::Curves),
24 Exposure(processing::exposure::Exposure),
25 HueSaturation(processing::hue_saturation::HueSaturation),
26 Levels(processing::levels::Levels),
27 Memo(processing::memo::Memo),
28 TimeRemap(processing::time_remap::TimeRemap),
29 Transform(processing::transform::Transform),
30 Crop(processing::crop::Crop),
31 Resize(processing::resize::Resize),
32 Shadow(processing::shadow::Shadow),
33 WgslShader(processing::wgsl_shader::WgslShader),
34 Switch(compositing::switch::Switch),
35 MediaOutput(media_output::MediaOutput),
36}
37
38impl NodeKind {
39 pub fn id(&self) -> NodeId {
40 match self {
41 Self::MediaIn(node) => node.id,
42 Self::Background(node) => node.id,
43 Self::Text(node) => node.id,
44 Self::Path(node) => node.id,
45 Self::Shape(node) => node.id,
46 Self::Boolean(node) => node.id,
47 Self::Merge(node) => node.id,
48 Self::RasterMultiMerge(node) => node.id,
49 Self::AlphaPremultiply(node) => node.id,
50 Self::Blur(node) => node.id,
51 Self::ChannelShuffle(node) => node.id,
52 Self::ColorGrade(node) => node.id,
53 Self::Curves(node) => node.id,
54 Self::Exposure(node) => node.id,
55 Self::HueSaturation(node) => node.id,
56 Self::Levels(node) => node.id,
57 Self::Memo(node) => node.id,
58 Self::TimeRemap(node) => node.id,
59 Self::Transform(node) => node.id,
60 Self::Crop(node) => node.id,
61 Self::Resize(node) => node.id,
62 Self::Shadow(node) => node.id,
63 Self::WgslShader(node) => node.id,
64 Self::Switch(node) => node.id,
65 Self::MediaOutput(node) => node.id,
66 }
67 }
68
69 pub fn input_ports(&self) -> Vec<PortRef> {
70 match self {
71 Self::MediaIn(node) => node.input_ports(),
72 Self::Background(node) => node.input_ports(),
73 Self::Text(node) => node.input_ports(),
74 Self::Path(node) => node.input_ports(),
75 Self::Shape(node) => node.input_ports(),
76 Self::Boolean(node) => node.input_ports(),
77 Self::Merge(node) => node.input_ports(),
78 Self::RasterMultiMerge(node) => node.input_ports(),
79 Self::AlphaPremultiply(node) => node.input_ports(),
80 Self::Blur(node) => node.input_ports(),
81 Self::ChannelShuffle(node) => node.input_ports(),
82 Self::ColorGrade(node) => node.input_ports(),
83 Self::Curves(node) => node.input_ports(),
84 Self::Exposure(node) => node.input_ports(),
85 Self::HueSaturation(node) => node.input_ports(),
86 Self::Levels(node) => node.input_ports(),
87 Self::Memo(node) => node.input_ports(),
88 Self::TimeRemap(node) => node.input_ports(),
89 Self::Transform(node) => node.input_ports(),
90 Self::Crop(node) => node.input_ports(),
91 Self::Resize(node) => node.input_ports(),
92 Self::Shadow(node) => node.input_ports(),
93 Self::WgslShader(node) => node.input_ports(),
94 Self::Switch(node) => node.input_ports(),
95 Self::MediaOutput(node) => node.input_ports(),
96 }
97 }
98
99 pub fn as_property_eval(&self) -> &dyn PropertyEval {
100 self
101 }
102
103 #[cfg(feature = "metadata")]
104 pub fn schemas() -> Vec<super::NodeSchemaDef> {
105 vec![
106 source::media_in::MediaIn::schema(),
107 source::background::Background::schema(),
108 source::text::Text::schema(),
109 vector::path::Path::schema(),
110 vector::shape::Shape::schema(),
111 compositing::boolean::Boolean::schema(),
112 compositing::merge::Merge::schema(),
113 compositing::raster_multimerge::RasterMultiMerge::schema(),
114 compositing::switch::Switch::schema(),
115 processing::memo::Memo::schema(),
116 processing::alpha_premultiply::AlphaPremultiply::schema(),
117 processing::blur::Blur::schema(),
118 processing::channel_shuffle::ChannelShuffle::schema(),
119 processing::color_grade::ColorGrade::schema(),
120 processing::curves::Curves::schema(),
121 processing::exposure::Exposure::schema(),
122 processing::hue_saturation::HueSaturation::schema(),
123 processing::levels::Levels::schema(),
124 processing::time_remap::TimeRemap::schema(),
125 processing::transform::Transform::schema(),
126 processing::crop::Crop::schema(),
127 processing::resize::Resize::schema(),
128 processing::shadow::Shadow::schema(),
129 processing::wgsl_shader::WgslShader::schema(),
130 media_output::MediaOutput::schema(),
131 ]
132 }
133}
134
135impl Node for NodeKind {
136 fn id(&self) -> NodeId {
137 self.id()
138 }
139
140 fn input_port_defs(&self) -> &'static [super::InputPortDef] {
141 match self {
142 Self::MediaIn(node) => node.input_port_defs(),
143 Self::Background(node) => node.input_port_defs(),
144 Self::Text(node) => node.input_port_defs(),
145 Self::Path(node) => node.input_port_defs(),
146 Self::Shape(node) => node.input_port_defs(),
147 Self::Boolean(node) => node.input_port_defs(),
148 Self::Merge(node) => node.input_port_defs(),
149 Self::RasterMultiMerge(node) => node.input_port_defs(),
150 Self::AlphaPremultiply(node) => node.input_port_defs(),
151 Self::Blur(node) => node.input_port_defs(),
152 Self::ChannelShuffle(node) => node.input_port_defs(),
153 Self::ColorGrade(node) => node.input_port_defs(),
154 Self::Curves(node) => node.input_port_defs(),
155 Self::Exposure(node) => node.input_port_defs(),
156 Self::HueSaturation(node) => node.input_port_defs(),
157 Self::Levels(node) => node.input_port_defs(),
158 Self::Memo(node) => node.input_port_defs(),
159 Self::TimeRemap(node) => node.input_port_defs(),
160 Self::Transform(node) => node.input_port_defs(),
161 Self::Crop(node) => node.input_port_defs(),
162 Self::Resize(node) => node.input_port_defs(),
163 Self::Shadow(node) => node.input_port_defs(),
164 Self::WgslShader(node) => node.input_port_defs(),
165 Self::Switch(node) => node.input_port_defs(),
166 Self::MediaOutput(node) => node.input_port_defs(),
167 }
168 }
169
170 fn input_ports(&self) -> Vec<PortRef> {
171 self.input_ports()
172 }
173
174 fn output_port_defs(&self) -> &'static [OutputPortDef] {
175 SINGLE_RASTER_OUTPUT
176 }
177}
178
179impl PropertyEval for NodeKind {
180 fn get_property(&self, id: &str) -> crate::Result<Option<PropertyExpression>> {
181 match self {
182 Self::MediaIn(node) => node.get_property(id),
183 Self::Background(node) => node.get_property(id),
184 Self::Text(node) => node.get_property(id),
185 Self::Path(node) => node.get_property(id),
186 Self::Shape(node) => node.get_property(id),
187 Self::Boolean(node) => node.get_property(id),
188 Self::Merge(node) => node.get_property(id),
189 Self::RasterMultiMerge(node) => node.get_property(id),
190 Self::AlphaPremultiply(node) => node.get_property(id),
191 Self::Blur(node) => node.get_property(id),
192 Self::ChannelShuffle(node) => node.get_property(id),
193 Self::ColorGrade(node) => node.get_property(id),
194 Self::Curves(node) => node.get_property(id),
195 Self::Exposure(node) => node.get_property(id),
196 Self::HueSaturation(node) => node.get_property(id),
197 Self::Levels(node) => node.get_property(id),
198 Self::Memo(node) => node.get_property(id),
199 Self::TimeRemap(node) => node.get_property(id),
200 Self::Transform(node) => node.get_property(id),
201 Self::Crop(node) => node.get_property(id),
202 Self::Resize(node) => node.get_property(id),
203 Self::Shadow(node) => node.get_property(id),
204 Self::WgslShader(node) => node.get_property(id),
205 Self::Switch(node) => node.get_property(id),
206 Self::MediaOutput(node) => node.get_property(id),
207 }
208 }
209}