use crate::rule::shape::{one_to_one, part_of};
use seesaw_tgg::rules::format::RuleFile;
const CATALOGUE_NAME: &str = "rust";
pub const STRUCT_TO_STRUCT: &str = "struct-to-struct";
pub const MEMBER_TO_FIELD: &str = "member-to-field";
pub const ENUM_TO_ENUM: &str = "enum-to-enum";
pub const ENUMERATOR_TO_VARIANT: &str = "enumerator-to-variant";
pub const ALIAS_TO_TYPE_ALIAS: &str = "alias-to-type-alias";
pub const UNION_TO_ENUM: &str = "union-to-enum";
pub const CASE_TO_VARIANT: &str = "case-to-variant";
pub const BITMASK_TO_STRUCT: &str = "bitmask-to-struct";
pub const BIT_TO_CONST: &str = "bit-to-const";
pub const BITSET_TO_STRUCT: &str = "bitset-to-struct";
pub const VALUETYPE_TO_STRUCT: &str = "valuetype-to-struct";
pub const MODULE_TO_MOD: &str = "module-to-mod";
pub const CONST_TO_CONST: &str = "const-to-const";
pub const EXCEPTION_TO_STRUCT: &str = "exception-to-struct";
pub const INTERFACE_TO_TRAIT: &str = "interface-to-trait";
pub const NATIVE_TO_ALIAS: &str = "native-to-alias";
#[must_use]
pub fn corba_data_catalogue() -> RuleFile {
let mut file = catalogue();
file.rules
.retain(|rule| rule.name != INTERFACE_TO_TRAIT && rule.name != VALUETYPE_TO_STRUCT);
file
}
#[must_use]
pub fn catalogue() -> RuleFile {
RuleFile {
format: 3,
name: CATALOGUE_NAME.to_string(),
rules: vec![
one_to_one(STRUCT_TO_STRUCT, "Structure", "RustStruct", "StructCorr"),
part_of(
MEMBER_TO_FIELD,
("Member", "Structure", "StructCorr"),
("RustField", "RustStruct", "FieldCorr"),
),
one_to_one(ENUM_TO_ENUM, "Enumeration", "RustEnum", "EnumCorr"),
part_of(
ENUMERATOR_TO_VARIANT,
("Enumerator", "Enumeration", "EnumCorr"),
("RustVariant", "RustEnum", "VariantCorr"),
),
one_to_one(ALIAS_TO_TYPE_ALIAS, "Alias", "RustTypeAlias", "AliasCorr"),
one_to_one(UNION_TO_ENUM, "Union", "RustUnionEnum", "UnionCorr"),
part_of(
CASE_TO_VARIANT,
("Case", "Union", "UnionCorr"),
("RustCaseVariant", "RustUnionEnum", "CaseCorr"),
),
one_to_one(BITMASK_TO_STRUCT, "Bitmask", "RustBitmask", "BitmaskCorr"),
part_of(
BIT_TO_CONST,
("BitValue", "Bitmask", "BitmaskCorr"),
("RustBitConst", "RustBitmask", "BitCorr"),
),
one_to_one(BITSET_TO_STRUCT, "Bitset", "RustBitset", "BitsetCorr"),
one_to_one(
VALUETYPE_TO_STRUCT,
"Valuetype",
"RustValueStruct",
"ValuetypeCorr",
),
one_to_one(MODULE_TO_MOD, "Module", "RustModule", "ModuleCorr"),
one_to_one(CONST_TO_CONST, "Const", "RustConst", "ConstCorr"),
one_to_one(
EXCEPTION_TO_STRUCT,
"Exception",
"RustErrorStruct",
"ExceptionCorr",
),
one_to_one(
INTERFACE_TO_TRAIT,
"Interface",
"RustTrait",
"InterfaceCorr",
),
one_to_one(NATIVE_TO_ALIAS, "Native", "RustNativeAlias", "NativeCorr"),
],
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_corba_data_catalogue_is_the_catalogue_without_the_two_dds_answers() {
let names = |file: &RuleFile| -> Vec<String> {
file.rules.iter().map(|rule| rule.name.clone()).collect()
};
let all = names(&catalogue());
let expected: Vec<String> = all
.iter()
.filter(|name| *name != INTERFACE_TO_TRAIT && *name != VALUETYPE_TO_STRUCT)
.cloned()
.collect();
assert_eq!(names(&corba_data_catalogue()), expected);
assert_eq!(all.len(), expected.len() + 2);
}
}