sklears_compose/workflow_language/
mod.rs1pub mod code_generation;
134pub mod component_registry;
135pub mod dsl_language;
136pub mod visual_builder;
137pub mod workflow_definitions;
138pub mod workflow_execution;
139
140#[allow(non_snake_case)]
142#[cfg(test)]
143pub mod workflow_tests;
144
145pub use workflow_definitions::{
147 Connection, ConnectionType, DataType, ExecutionConfig, ExecutionMode, InputDefinition,
148 OutputDefinition, ParameterDefinition, ParameterValue, ResourceRequirements, StepDefinition,
149 StepStatus, StepType, ValidationResult, WorkflowDefinition, WorkflowMetadata, WorkflowStatus,
150};
151
152pub use visual_builder::{
153 CanvasConfig, CanvasInteraction, ComponentPosition, DragState, GridConfig, Position,
154 SelectionState, UndoRedoManager, ValidationState, ViewportConfig, VisualPipelineBuilder,
155 WorkflowHistory, WorkflowSnapshot, ZoomConfig,
156};
157
158pub use component_registry::{
159 ComponentDefinition, ComponentDiscovery, ComponentMetadata, ComponentRegistry,
160 ComponentSignature, ComponentType, ComponentValidator, ComponentVersion, ParameterSchema,
161 PortDefinition, RegistryError,
162};
163
164pub use workflow_execution::{
165 ExecutionContext, ExecutionResult, ExecutionState, ExecutionStatistics, ExecutionTracker,
166 ParallelExecutionConfig, ResourceAllocation, ResourceManager, StepExecutionResult,
167 WorkflowExecutionError, WorkflowExecutor,
168};
169
170pub use code_generation::{
171 CodeGenerationConfig, CodeGenerationError, CodeGenerator, CodeLanguage, CodeTemplate,
172 FileFormat, GeneratedCode, GenerationStatistics, LanguageBackend, OptimizationLevel,
173 TargetLanguage, TemplateContext, TemplateEngine, TemplateRegistry,
174};
175
176pub use dsl_language::{
177 AstNode, AutoCompleter, DslConfig, DslError, DslLexer, DslParser, LexError, ParseError,
178 ParseResult, PipelineDSL, SemanticAnalyzer, SymbolTable, SyntaxHighlighter, Token, TokenType,
179 TypeChecker,
180};
181
182pub type WorkflowResult<T> = Result<T, WorkflowError>;
184
185#[derive(Debug, thiserror::Error)]
187pub enum WorkflowError {
188 #[error("Validation error: {0}")]
189 Validation(String),
190
191 #[error("Execution error: {0}")]
192 Execution(#[from] WorkflowExecutionError),
193
194 #[error("Code generation error: {0}")]
195 CodeGeneration(#[from] CodeGenerationError),
196
197 #[error("Parse error: {0}")]
198 Parse(#[from] ParseError),
199
200 #[error("Registry error: {0}")]
201 Registry(#[from] RegistryError),
202
203 #[error("I/O error: {0}")]
204 Io(#[from] std::io::Error),
205
206 #[error("Serialization error: {0}")]
207 Serialization(#[from] serde_json::Error),
208
209 #[error("Sklears error: {0}")]
210 Sklears(#[from] sklears_core::error::SklearsError),
211}
212
213impl WorkflowDefinition {
215 #[must_use]
217 pub fn builder() -> WorkflowBuilder {
218 WorkflowBuilder::new()
219 }
220
221 pub fn from_dsl(dsl_code: &str) -> Result<Self, ParseError> {
223 let mut dsl = PipelineDSL::new();
224 dsl.parse(dsl_code)
225 .map_err(|e| ParseError::InvalidSyntax(format!("DSL parse error: {e}"), 0, 0))
226 }
227
228 pub fn generate_code(&self, language: TargetLanguage) -> Result<String, CodeGenerationError> {
230 let config = CodeGenerationConfig {
231 language,
232 ..Default::default()
233 };
234 let mut generator = CodeGenerator::new(config);
235 let generated = generator.generate_code(self)?;
236 Ok(generated.source_code)
237 }
238
239 #[must_use]
241 pub fn execute(&self, context: ExecutionContext) -> ExecutionResult {
242 let mut executor = WorkflowExecutor::new();
243 executor.execute_workflow(self.clone()).unwrap_or_default()
245 }
246}
247
248pub struct WorkflowBuilder {
250 metadata: WorkflowMetadata,
251 inputs: Vec<InputDefinition>,
252 outputs: Vec<OutputDefinition>,
253 steps: Vec<StepDefinition>,
254 connections: Vec<Connection>,
255 execution: ExecutionConfig,
256}
257
258impl WorkflowBuilder {
259 #[must_use]
260 pub fn new() -> Self {
261 Self {
262 metadata: WorkflowMetadata::default(),
263 inputs: Vec::new(),
264 outputs: Vec::new(),
265 steps: Vec::new(),
266 connections: Vec::new(),
267 execution: ExecutionConfig::default(),
268 }
269 }
270
271 pub fn name(mut self, name: impl Into<String>) -> Self {
272 self.metadata.name = name.into();
273 self
274 }
275
276 pub fn version(mut self, version: impl Into<String>) -> Self {
277 self.metadata.version = version.into();
278 self
279 }
280
281 pub fn description(mut self, description: impl Into<String>) -> Self {
282 self.metadata.description = Some(description.into());
283 self
284 }
285
286 #[must_use]
287 pub fn add_input(mut self, input: InputDefinition) -> Self {
288 self.inputs.push(input);
289 self
290 }
291
292 #[must_use]
293 pub fn add_output(mut self, output: OutputDefinition) -> Self {
294 self.outputs.push(output);
295 self
296 }
297
298 #[must_use]
299 pub fn add_step(mut self, step: StepDefinition) -> Self {
300 self.steps.push(step);
301 self
302 }
303
304 #[must_use]
305 pub fn add_connection(mut self, connection: Connection) -> Self {
306 self.connections.push(connection);
307 self
308 }
309
310 #[must_use]
311 pub fn execution_config(mut self, config: ExecutionConfig) -> Self {
312 self.execution = config;
313 self
314 }
315
316 #[must_use]
317 pub fn build(self) -> WorkflowDefinition {
318 WorkflowDefinition {
320 metadata: self.metadata,
321 inputs: self.inputs,
322 outputs: self.outputs,
323 steps: self.steps,
324 connections: self.connections,
325 execution: self.execution,
326 }
327 }
328}
329
330impl Default for WorkflowBuilder {
331 fn default() -> Self {
332 Self::new()
333 }
334}
335
336#[must_use]
338pub fn create_workflow(name: &str) -> WorkflowBuilder {
339 WorkflowBuilder::new().name(name)
340}
341
342pub fn parse_workflow(dsl_code: &str) -> Result<WorkflowDefinition, ParseError> {
343 WorkflowDefinition::from_dsl(dsl_code)
344}
345
346pub fn create_visual_builder() -> Result<VisualPipelineBuilder, WorkflowError> {
347 Ok(VisualPipelineBuilder::new())
348}
349
350pub fn create_code_generator() -> Result<CodeGenerator, WorkflowError> {
351 Ok(CodeGenerator::new(CodeGenerationConfig::default()))
352}
353
354pub struct WorkflowIntegration;
356
357impl WorkflowIntegration {
358 pub fn visual_to_dsl(builder: &VisualPipelineBuilder) -> Result<String, WorkflowError> {
360 let dsl = PipelineDSL::new();
361 Ok(dsl.generate(&builder.workflow))
362 }
363
364 pub fn visual_to_execution(
366 builder: &VisualPipelineBuilder,
367 context: ExecutionContext,
368 ) -> Result<WorkflowExecutor, WorkflowError> {
369 let executor = WorkflowExecutor::new();
370 Ok(executor)
372 }
373
374 pub fn visual_to_code(
376 builder: &VisualPipelineBuilder,
377 language: TargetLanguage,
378 ) -> Result<String, WorkflowError> {
379 let config = CodeGenerationConfig {
380 language,
381 ..Default::default()
382 };
383 let mut generator = CodeGenerator::new(config);
384 let generated = generator.generate_code(&builder.workflow)?;
385 Ok(generated.source_code)
386 }
387
388 pub fn dsl_to_code(dsl_code: &str, language: TargetLanguage) -> Result<String, WorkflowError> {
390 let workflow = WorkflowDefinition::from_dsl(dsl_code)?;
391 let config = CodeGenerationConfig {
392 language,
393 ..Default::default()
394 };
395 let mut generator = CodeGenerator::new(config);
396 let generated = generator.generate_code(&workflow)?;
397 Ok(generated.source_code)
398 }
399}
400
401#[allow(non_snake_case)]
402#[cfg(test)]
403mod tests {
404 use super::*;
405
406 #[test]
407 fn test_workflow_builder() {
408 let workflow = WorkflowBuilder::new()
409 .name("test_workflow")
410 .version("1.0.0")
411 .description("Test workflow for builder pattern")
412 .build();
413
414 assert_eq!(workflow.metadata.name, "test_workflow");
415 assert_eq!(workflow.metadata.version, "1.0.0");
416 assert_eq!(
417 workflow.metadata.description,
418 Some("Test workflow for builder pattern".to_string())
419 );
420 }
421
422 #[test]
423 fn test_convenience_functions() {
424 let builder = create_workflow("test");
425 let workflow = builder.build();
426 assert_eq!(workflow.metadata.name, "test");
427 }
428
429 #[test]
430 fn test_module_integration() {
431 let _registry = ComponentRegistry::default();
433 let _config = CanvasConfig::default();
434 let _exec_config = ExecutionConfig::default();
435
436 let _result: WorkflowResult<()> = Ok(());
438 }
439}