mod dependency;
mod info;
mod platform;
pub use dependency::*;
use anyhow::Result;
use crate::pbxproj::*;
pub use info::PBXTargetInfo;
pub use platform::PBXTargetPlatform;
#[derive(Debug, derive_new::new)]
pub struct PBXTarget<'a> {
pub id: String,
pub name: Option<&'a String>,
pub product_name: Option<&'a String>,
pub product_type: PBXProductType,
pub build_configuration_list: Option<XCConfigurationList<'a>>,
pub build_phases: Vec<PBXBuildPhase<'a>>,
pub build_rules: Vec<PBXBuildRule<'a>>,
pub target_dependencies: Vec<PBXTargetDependency<'a>>,
pub product: Option<PBXFSReference<'a>>,
pub package_product_dependencies: Vec<XCSwiftPackageProductDependency<'a>>,
pub kind: &'a PBXTargetKind,
pub product_install_path: Option<&'a String>,
pub build_tool_path: Option<&'a String>,
pub build_arguments_string: Option<&'a String>,
pub pass_build_settings_in_environment: Option<bool>,
pub build_working_directory: Option<&'a String>,
}
impl<'a> PBXTarget<'a> {
pub fn info(&'a self, objects: &'a PBXObjectCollection) -> PBXTargetInfo {
PBXTargetInfo::new(self, objects)
}
}
impl<'a> AsPBXObject<'a> for PBXTarget<'a> {
fn as_pbx_object(
id: String,
value: &'a PBXHashMap,
objects: &'a PBXObjectCollection,
) -> Result<Self>
where
Self: Sized + 'a,
{
let kind = value
.get_kind("isa")
.and_then(|v| v.as_pbx_target())
.unwrap();
Ok(Self {
id,
name: value.get_string("name"),
product_name: value.get_string("productName"),
product_type: value.try_get_string("productType")?.as_str().into(),
build_configuration_list: value
.get_string("buildConfigurationList")
.and_then(|key| objects.get(key)),
build_phases: value
.get_vec("buildPhases")
.map(|vec| objects.get_vec(vec.as_vec_strings()))
.unwrap_or_default(),
build_rules: value
.get_vec("buildRules")
.map(|v| objects.get_vec(v.as_vec_strings()))
.unwrap_or_default(),
target_dependencies: value
.get_vec("dependencies")
.map(|v| objects.get_vec(v.as_vec_strings()))
.unwrap_or_default(),
product: value
.get_string("productReference")
.and_then(|key| objects.get(key)),
package_product_dependencies: value
.get_vec("packageProductDependencies")
.map(|v| objects.get_vec(v.as_vec_strings()))
.unwrap_or_default(),
product_install_path: if kind.is_native() {
value.get_string("productInstallPath")
} else {
None
},
kind,
build_tool_path: value.get_string("buildToolPath"),
build_arguments_string: value.get_string("buildArgumentsString"),
pass_build_settings_in_environment: value
.get_number("passBuildSettingsInEnvironment")
.map(|n| n == &1),
build_working_directory: value.get_string("buildWorkingDirectory"),
})
}
}
#[cfg(test)]
mod tests {
use crate::pbxproj::test_demo_file;
macro_rules! test_samples {
($($name:ident),*) => {
$(#[test]
fn $name() {
let root_object = test_demo_file!($name);
for target in root_object.targets() {
let platform = target.info(&root_object);
println!("[{}] => {:?}: {:?}", stringify!($name), target.id, platform);
}
})*
};
}
test_samples![demo1, demo2, demo3, demo4, demo5, demo6, demo7, demo8, demo9, demo10, demo11];
}