Skip to main content

oxihuman_core/
pipeline_pattern.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5pub struct PipelineStruct {
6    pub stages: Vec<String>,
7}
8
9pub struct PipelineContextStruct {
10    pub data: std::collections::HashMap<String, String>,
11    pub stage: usize,
12}
13
14pub fn new_pipeline_struct(stages: Vec<&str>) -> PipelineStruct {
15    PipelineStruct {
16        stages: stages.into_iter().map(|s| s.to_string()).collect(),
17    }
18}
19
20pub fn pipeline_stage_count(p: &PipelineStruct) -> usize {
21    p.stages.len()
22}
23
24pub fn new_pipeline_context_struct() -> PipelineContextStruct {
25    PipelineContextStruct {
26        data: std::collections::HashMap::new(),
27        stage: 0,
28    }
29}
30
31pub fn context_set(c: &mut PipelineContextStruct, key: &str, val: &str) {
32    c.data.insert(key.to_string(), val.to_string());
33}
34
35pub fn context_get<'a>(c: &'a PipelineContextStruct, key: &str) -> Option<&'a str> {
36    c.data.get(key).map(|s| s.as_str())
37}
38
39pub fn context_advance(c: &mut PipelineContextStruct) {
40    c.stage += 1;
41}
42
43pub fn context_stage(c: &PipelineContextStruct) -> usize {
44    c.stage
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test_pipeline_stage_count() {
53        /* count stages in pipeline */
54        let p = new_pipeline_struct(vec!["parse", "validate", "execute"]);
55        assert_eq!(pipeline_stage_count(&p), 3);
56    }
57
58    #[test]
59    fn test_context_set_get() {
60        /* set and get context values */
61        let mut c = new_pipeline_context_struct();
62        context_set(&mut c, "key", "value");
63        assert_eq!(context_get(&c, "key"), Some("value"));
64        assert_eq!(context_get(&c, "missing"), None);
65    }
66
67    #[test]
68    fn test_context_advance() {
69        /* advance stage index */
70        let mut c = new_pipeline_context_struct();
71        assert_eq!(context_stage(&c), 0);
72        context_advance(&mut c);
73        assert_eq!(context_stage(&c), 1);
74    }
75
76    #[test]
77    fn test_empty_pipeline() {
78        /* empty pipeline has zero stages */
79        let p = new_pipeline_struct(vec![]);
80        assert_eq!(pipeline_stage_count(&p), 0);
81    }
82
83    #[test]
84    fn test_context_multiple_keys() {
85        /* multiple key-value pairs stored */
86        let mut c = new_pipeline_context_struct();
87        context_set(&mut c, "a", "1");
88        context_set(&mut c, "b", "2");
89        assert_eq!(context_get(&c, "a"), Some("1"));
90        assert_eq!(context_get(&c, "b"), Some("2"));
91    }
92
93    #[test]
94    fn test_context_overwrite() {
95        /* overwriting a key updates it */
96        let mut c = new_pipeline_context_struct();
97        context_set(&mut c, "x", "old");
98        context_set(&mut c, "x", "new");
99        assert_eq!(context_get(&c, "x"), Some("new"));
100    }
101
102    #[test]
103    fn test_context_advance_multiple() {
104        /* advance multiple times */
105        let mut c = new_pipeline_context_struct();
106        context_advance(&mut c);
107        context_advance(&mut c);
108        assert_eq!(context_stage(&c), 2);
109    }
110}