workshop_rs/actions/
layout.rs1use crate::catalog::{Catalog, Locale};
4use crate::output::emitter::EmitContext;
5use crate::wir;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub struct ActionLayout {
11 pub width: usize,
13}
14
15#[derive(Debug, Clone, PartialEq, Eq)]
17pub enum ActionLayoutError {
18 InvalidWIR(crate::wir::error::IrError),
20 Emission(crate::WorkshopError),
22}
23
24impl std::fmt::Display for ActionLayoutError {
25 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26 match self {
27 Self::InvalidWIR(error) => write!(f, "invalid WIR: {error}"),
28 Self::Emission(error) => write!(f, "action layout emission failed: {error}"),
29 }
30 }
31}
32
33impl std::error::Error for ActionLayoutError {}
34
35pub fn action_width(
43 program: &wir::Program,
44 catalog: &Catalog,
45 locale: &Locale,
46 actions: &[wir::ActionId],
47) -> std::result::Result<ActionLayout, ActionLayoutError> {
48 program.validate().map_err(ActionLayoutError::InvalidWIR)?;
49 let mut emitter = EmitContext {
50 program,
51 catalog,
52 locale: locale.clone(),
53 fallback: None,
54 fallback_ids: Vec::new(),
55 force_hero_constructors: false,
56 out: String::new(),
57 line_count: 0,
58 };
59 for action in actions {
60 emitter
61 .action(*action, 0, false)
62 .map_err(ActionLayoutError::Emission)?;
63 }
64 Ok(ActionLayout {
65 width: emitter.line_count,
66 })
67}