xbase-lab / xcodeproj

XcodeProj parser and data representation
5 stars 2 forks source link

Wrap target #2

Closed github-actions[bot] closed 2 years ago

github-actions[bot] commented 2 years ago

https://github.com/tami5/xcodeproj/blob/2334b75af073d1d46d3b6422ed3b6aefcd6b13de/src/pbxproj/object/project.rs#L68


    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())