Skip to main content

ralph_workflow/json_parser/codex/
io.rs

1use std::cell::RefCell;
2use std::collections::HashMap;
3
4use crate::json_parser::streaming_state::StreamingSession;
5use crate::json_parser::terminal::TerminalMode;
6use crate::json_parser::types::DeltaAccumulator;
7
8pub struct CodexParserState {
9    pub streaming_session: std::rc::Rc<RefCell<StreamingSession>>,
10    pub reasoning_accumulator: std::rc::Rc<RefCell<DeltaAccumulator>>,
11    pub turn_counter: std::rc::Rc<RefCell<u64>>,
12    pub terminal_mode: RefCell<TerminalMode>,
13    pub last_rendered_content: RefCell<HashMap<String, String>>,
14}
15
16impl CodexParserState {
17    pub fn new(verbose_warnings: bool) -> Self {
18        let streaming_session = StreamingSession::new().with_verbose_warnings(verbose_warnings);
19        Self {
20            streaming_session: std::rc::Rc::new(RefCell::new(streaming_session)),
21            reasoning_accumulator: std::rc::Rc::new(RefCell::new(DeltaAccumulator::new())),
22            turn_counter: std::rc::Rc::new(RefCell::new(0)),
23            terminal_mode: RefCell::new(TerminalMode::detect()),
24            last_rendered_content: RefCell::new(HashMap::new()),
25        }
26    }
27
28    pub fn with_session_mut<R>(&self, f: impl FnOnce(&mut StreamingSession) -> R) -> R {
29        f(&mut self.streaming_session.borrow_mut())
30    }
31
32    pub fn with_reasoning_accumulator_mut<R>(
33        &self,
34        f: impl FnOnce(&mut DeltaAccumulator) -> R,
35    ) -> R {
36        f(&mut self.reasoning_accumulator.borrow_mut())
37    }
38
39    pub fn with_turn_counter_mut<R>(&self, f: impl FnOnce(&mut u64) -> R) -> R {
40        f(&mut self.turn_counter.borrow_mut())
41    }
42
43    pub fn with_last_rendered_content_mut<R>(
44        &self,
45        f: impl FnOnce(&mut HashMap<String, String>) -> R,
46    ) -> R {
47        f(&mut self.last_rendered_content.borrow_mut())
48    }
49}