products_group_reference: Option<String>,
/// The object is a reference to a PBXGroup element.
main_group_reference: String,
/// root
objects: WeakPBXObjectCollection,
}
impl PBXProject {
/// Get packages that the project uses
#[must_use]
pub fn packages<'a>(&self) -> Option<Vec<Rc<RefCell<XCRemoteSwiftPackageReference>>>> {
let package_references = self.package_references.as_ref()?;
let objects = self.objects.upgrade()?;
let objects = objects.borrow();
let mut packages = vec![];
for id in package_references.iter() {
if let Some(object) = objects
.get(id)
.map(|o| o.as_xc_remote_swift_package_reference())
.flatten()
{
packages.push(object.clone())
}
}
Some(packages)
}
/// Get targets for given reference
/// TODO: Wrap target
#[must_use]
pub fn targets(&self) -> Vec<PBXObject> {
let objects = if let Some(objects) = self.objects.upgrade() {
objects
} else {
return vec![];
};
let objects = objects.borrow();
let mut targets = vec![];
for id in self.target_references.iter() {
if let Some(object) = objects.get(id) {
targets.push(object.clone())
}
}
targets
}
/// Returns the attributes of a given target.
#[must_use]
fn get_attributes_for_target_reference(&self, target_reference: &str) -> Option<&PBXHashMap> {
self.target_attribute_references
.as_ref()?
.get(target_reference)?
.as_object()
}
}
#[test]
fn test_collections() {
use crate::pbxproj::pest::PBXProjectParser;
use crate::pbxproj::PBXRootObject;
let file = PBXProjectParser::try_from_str(include_str!("../../../tests/samples/demo1.pbxproj"))
.unwrap();
let root = PBXRootObject::try_from(file).unwrap();
let inner = root.borrow();
let project = inner
.iter()
.find(|s| s.1.is_pbx_project())
.map(|(_, o)| o.as_pbx_project().unwrap().clone())
.unwrap();
let project = project.borrow();
let packages = project.packages();
let targets = project.targets();
println!("Packages: {:#?}", packages);
println!("Targets: {:#?}", targets);
}
impl PBXObjectExt for PBXProject {
fn from_hashmap(
mut value: PBXHashMap,
objects: WeakPBXObjectCollection,
) -> anyhow::Result<Self> {
let project_roots = if let Some(roots) = value
.remove_vec("projectRoots")
.map(|v| v.try_into_vec_strings().ok())
https://github.com/tami5/xcodeproj/blob/2334b75af073d1d46d3b6422ed3b6aefcd6b13de/src/pbxproj/object/project.rs#L68