use crate::pbxproj::*;
#[derive(Debug, derive_new::new)]
pub struct XCConfigurationList<'a> {
pub id: String,
pub build_configurations: Vec<XCBuildConfiguration<'a>>,
pub default_configuration_is_visible: bool,
pub default_configuration_name: Option<&'a String>,
}
impl<'a> AsPBXObject<'a> for XCConfigurationList<'a> {
fn as_pbx_object(
id: String,
value: &'a PBXHashMap,
objects: &'a PBXObjectCollection,
) -> anyhow::Result<Self>
where
Self: Sized + 'a,
{
Ok(Self {
id,
build_configurations: value
.get_vec("buildConfigurations")
.map(|v| objects.get_vec(v.as_vec_strings()))
.unwrap_or_default(),
default_configuration_is_visible: value
.try_get_number("defaultConfigurationIsVisible")?
== &1,
default_configuration_name: value.get_string("defaultConfigurationName"),
})
}
}
impl<'a> XCConfigurationList<'a> {
pub fn extract_sdkroot_from_children(&self, objects: &PBXObjectCollection) -> Option<String> {
let mut sdkroots = self
.build_configurations
.iter()
.flat_map(|b| b.build_settings.get_string("SDKROOT"))
.collect::<Vec<&String>>();
sdkroots.dedup();
if sdkroots.is_empty() {
tracing::trace!(
"no sdkroot found in build_configuration_list: {:?}",
self.id
);
self.build_configurations
.iter()
.flat_map(|b| Some(b.base_configuration.as_ref()?.id.as_str()))
.flat_map(|id| objects.get_build_configurations_by_base_id(id))
.flat_map(|b| b.build_settings.get_string("SDKROOT"))
.for_each(|root| sdkroots.push(root));
if sdkroots.is_empty() {
tracing::trace!(
"Find SDKROOT: No base configuration in all config_list's configuration",
);
return None;
}
} else if sdkroots.len() > 1 {
tracing::trace!("Find SDKROOT: Get more then one sdkroot {:?}", self.id);
tracing::trace!("Find SDKROOT Using {:?} as sdkroot", &sdkroots[0]);
}
Some(sdkroots[0].into())
}
}