Skip to main content

shape_runtime/
pattern_library.rs

1//! Pattern library stub for semantic analysis
2//!
3//! Patterns are now loaded from Shape files, not hardcoded.
4//! This is a minimal stub to satisfy the semantic analyzer.
5
6use std::collections::HashSet;
7
8pub struct PatternLibrary {
9    pattern_names: HashSet<String>,
10}
11
12impl Default for PatternLibrary {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl PatternLibrary {
19    pub fn new() -> Self {
20        // Initialize with standard pattern names from stdlib.patterns
21        let mut pattern_names = HashSet::new();
22
23        // Single row patterns
24        pattern_names.insert("hammer".to_string());
25        pattern_names.insert("doji".to_string());
26        pattern_names.insert("shooting_star".to_string());
27        pattern_names.insert("dragonfly_doji".to_string());
28        pattern_names.insert("gravestone_doji".to_string());
29        pattern_names.insert("long_legged_doji".to_string());
30        pattern_names.insert("marubozu".to_string());
31        pattern_names.insert("bullish_marubozu".to_string());
32        pattern_names.insert("bearish_marubozu".to_string());
33        pattern_names.insert("spinning_top".to_string());
34
35        // Two row patterns
36        pattern_names.insert("bullish_engulfing".to_string());
37        pattern_names.insert("bearish_engulfing".to_string());
38        pattern_names.insert("tweezer_top".to_string());
39        pattern_names.insert("tweezer_bottom".to_string());
40        pattern_names.insert("piercing_line".to_string());
41        pattern_names.insert("dark_cloud_cover".to_string());
42        pattern_names.insert("bullish_harami".to_string());
43        pattern_names.insert("bearish_harami".to_string());
44        pattern_names.insert("harami".to_string());
45        pattern_names.insert("bullish_belt_hold".to_string());
46        pattern_names.insert("bearish_belt_hold".to_string());
47        pattern_names.insert("in_neck_line".to_string());
48        pattern_names.insert("on_neck_line".to_string());
49        pattern_names.insert("thrusting_pattern".to_string());
50
51        // Three row patterns
52        pattern_names.insert("morning_star".to_string());
53        pattern_names.insert("evening_star".to_string());
54        pattern_names.insert("three_white_soldiers".to_string());
55        pattern_names.insert("three_black_crows".to_string());
56        pattern_names.insert("three_inside_up".to_string());
57        pattern_names.insert("three_inside_down".to_string());
58        pattern_names.insert("three_outside_up".to_string());
59        pattern_names.insert("three_outside_down".to_string());
60        pattern_names.insert("abandoned_baby_bullish".to_string());
61        pattern_names.insert("abandoned_baby_bearish".to_string());
62        pattern_names.insert("bullish_tri_star".to_string());
63        pattern_names.insert("bearish_tri_star".to_string());
64
65        Self { pattern_names }
66    }
67
68    pub fn has_pattern(&self, name: &str) -> bool {
69        self.pattern_names.contains(name)
70    }
71
72    pub fn pattern_names(&self) -> Vec<String> {
73        self.pattern_names.iter().cloned().collect()
74    }
75}