use crate::import::ImportEntry;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub enum ImportSpec {
Named {
module: String,
name: String,
alias: Option<String>,
is_type_only: bool,
},
SideEffect {
module: String,
},
Wildcard {
module: String,
},
}
impl ImportSpec {
pub fn named(module: &str, name: &str) -> Self {
ImportSpec::Named {
module: module.to_string(),
name: name.to_string(),
alias: None,
is_type_only: false,
}
}
pub fn named_as(module: &str, name: &str, alias: &str) -> Self {
ImportSpec::Named {
module: module.to_string(),
name: name.to_string(),
alias: Some(alias.to_string()),
is_type_only: false,
}
}
pub fn named_type(module: &str, name: &str) -> Self {
ImportSpec::Named {
module: module.to_string(),
name: name.to_string(),
alias: None,
is_type_only: true,
}
}
pub fn side_effect(module: &str) -> Self {
ImportSpec::SideEffect {
module: module.to_string(),
}
}
pub fn wildcard(module: &str) -> Self {
ImportSpec::Wildcard {
module: module.to_string(),
}
}
pub(crate) fn into_entry(self) -> ImportEntry {
match self {
ImportSpec::Named {
module,
name,
alias,
is_type_only,
..
} => ImportEntry {
module,
name,
alias,
is_type_only,
is_side_effect: false,
is_wildcard: false,
},
ImportSpec::SideEffect { module, .. } => ImportEntry {
module,
name: String::new(),
alias: None,
is_type_only: false,
is_side_effect: true,
is_wildcard: false,
},
ImportSpec::Wildcard { module, .. } => ImportEntry {
module,
name: String::new(),
alias: None,
is_type_only: false,
is_side_effect: false,
is_wildcard: true,
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_named_import() {
let spec = ImportSpec::named("./models", "User");
let entry = spec.into_entry();
assert_eq!(entry.module, "./models");
assert_eq!(entry.name, "User");
assert!(entry.alias.is_none());
assert!(!entry.is_type_only);
assert!(!entry.is_side_effect);
assert!(!entry.is_wildcard);
}
#[test]
fn test_named_as_import() {
let spec = ImportSpec::named_as("./models", "User", "MyUser");
let entry = spec.into_entry();
assert_eq!(entry.name, "User");
assert_eq!(entry.alias.as_deref(), Some("MyUser"));
}
#[test]
fn test_named_type_import() {
let spec = ImportSpec::named_type("./models", "User");
let entry = spec.into_entry();
assert!(entry.is_type_only);
}
#[test]
fn test_side_effect_import() {
let spec = ImportSpec::side_effect("./polyfill");
let entry = spec.into_entry();
assert!(entry.is_side_effect);
assert!(entry.name.is_empty());
assert_eq!(entry.module, "./polyfill");
}
#[test]
fn test_wildcard_import() {
let spec = ImportSpec::wildcard("./utils");
let entry = spec.into_entry();
assert!(entry.is_wildcard);
assert!(entry.name.is_empty());
assert_eq!(entry.module, "./utils");
}
}