use swc_ecma_ast::BlockStmt;
#[derive(Debug, Clone)]
pub enum FunctionBody {
ECMAScript(BlockStmt),
Go {
body_node: usize,
source: String,
},
Java {
body_node: usize,
source: String,
},
Python {
body_node: usize,
source: String,
},
Rust {
source: String,
},
}
impl FunctionBody {
pub fn ecmascript(block: BlockStmt) -> Self {
FunctionBody::ECMAScript(block)
}
pub fn is_ecmascript(&self) -> bool {
matches!(self, FunctionBody::ECMAScript(_))
}
pub fn is_go(&self) -> bool {
matches!(self, FunctionBody::Go { .. })
}
pub fn is_java(&self) -> bool {
matches!(self, FunctionBody::Java { .. })
}
pub fn is_python(&self) -> bool {
matches!(self, FunctionBody::Python { .. })
}
pub fn is_rust(&self) -> bool {
matches!(self, FunctionBody::Rust { .. })
}
pub fn as_ecmascript(&self) -> &BlockStmt {
match self {
FunctionBody::ECMAScript(block) => block,
_ => panic!("FunctionBody is not ECMAScript"),
}
}
pub fn as_ecmascript_mut(&mut self) -> &mut BlockStmt {
match self {
FunctionBody::ECMAScript(block) => block,
_ => panic!("FunctionBody is not ECMAScript"),
}
}
pub fn as_go(&self) -> (usize, &str) {
match self {
FunctionBody::Go { body_node, source } => (*body_node, source.as_str()),
_ => panic!("FunctionBody is not Go"),
}
}
pub fn as_java(&self) -> (usize, &str) {
match self {
FunctionBody::Java { body_node, source } => (*body_node, source.as_str()),
_ => panic!("FunctionBody is not Java"),
}
}
pub fn as_python(&self) -> (usize, &str) {
match self {
FunctionBody::Python { body_node, source } => (*body_node, source.as_str()),
_ => panic!("FunctionBody is not Python"),
}
}
pub fn as_rust(&self) -> &str {
match self {
FunctionBody::Rust { source } => source.as_str(),
_ => panic!("FunctionBody is not Rust"),
}
}
}
impl From<BlockStmt> for FunctionBody {
fn from(block: BlockStmt) -> Self {
FunctionBody::ECMAScript(block)
}
}
#[cfg(test)]
mod tests {
use super::*;
use swc_common::DUMMY_SP;
fn make_test_block() -> BlockStmt {
BlockStmt {
span: DUMMY_SP,
ctxt: Default::default(),
stmts: vec![],
}
}
#[test]
fn test_create_ecmascript() {
let block = make_test_block();
let body = FunctionBody::ecmascript(block.clone());
assert!(body.is_ecmascript());
}
#[test]
fn test_from_block_stmt() {
let block = make_test_block();
let body: FunctionBody = block.clone().into();
assert!(body.is_ecmascript());
}
#[test]
fn test_as_ecmascript() {
let block = make_test_block();
let body = FunctionBody::ecmascript(block.clone());
let retrieved = body.as_ecmascript();
assert_eq!(retrieved.stmts.len(), 0);
}
#[test]
fn test_as_ecmascript_mut() {
let block = make_test_block();
let mut body = FunctionBody::ecmascript(block);
let retrieved = body.as_ecmascript_mut();
assert_eq!(retrieved.stmts.len(), 0);
}
#[test]
#[should_panic(expected = "FunctionBody is not ECMAScript")]
fn test_as_ecmascript_panics_on_wrong_type() {
let block = make_test_block();
let body = FunctionBody::ecmascript(block);
let _ = body.as_ecmascript();
panic!("FunctionBody is not ECMAScript");
}
}