ralph_workflow/json_parser/codex/
io.rs1use 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}