use crate::{
metadata::{
method::MethodMap,
tables::{StateMachineMethod, StateMachineMethodRc, TableId, TableInfoRef, TableRow},
token::Token,
},
Error::TypeNotFound,
Result,
};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct StateMachineMethodRaw {
pub rid: u32,
pub token: Token,
pub offset: usize,
pub move_next_method: u32,
pub kickoff_method: u32,
}
impl StateMachineMethodRaw {
pub fn to_owned(&self, method_map: &MethodMap) -> Result<StateMachineMethodRc> {
let move_next_token = Token::new(0x0600_0000 | self.move_next_method);
let kickoff_token = Token::new(0x0600_0000 | self.kickoff_method);
let move_next_method = method_map
.get(&move_next_token)
.ok_or(TypeNotFound(move_next_token))?
.value()
.clone();
let kickoff_method = method_map
.get(&kickoff_token)
.ok_or(TypeNotFound(kickoff_token))?
.value()
.clone();
Ok(Arc::new(StateMachineMethod {
rid: self.rid,
token: self.token,
offset: self.offset,
move_next_method,
kickoff_method,
}))
}
}
impl TableRow for StateMachineMethodRaw {
#[rustfmt::skip]
fn row_size(sizes: &TableInfoRef) -> u32 {
u32::from(
sizes.table_index_bytes(TableId::MethodDef)
.saturating_add(sizes.table_index_bytes(TableId::MethodDef))
)
}
}