1- use super :: PBXObject ;
2- use std:: { cell:: RefCell , collections:: HashMap , rc:: Weak } ;
1+ use super :: { PBXObject , PBXTarget , XCRemoteSwiftPackageReference } ;
2+ use std:: {
3+ cell:: RefCell ,
4+ collections:: HashMap ,
5+ rc:: { Rc , Weak } ,
6+ } ;
37
48/// An alias for weak reference of [`PBXObjectCollection`]
59pub type WeakPBXObjectCollection = Weak < RefCell < PBXObjectCollection > > ;
@@ -8,62 +12,71 @@ pub type WeakPBXObjectCollection = Weak<RefCell<PBXObjectCollection>>;
812#[ derive( Default , Debug , derive_new:: new, derive_deref_rs:: Deref ) ]
913pub struct PBXObjectCollection ( pub ( crate ) HashMap < String , PBXObject > ) ;
1014
15+ /// TODO: make collections a HashSet of PBXObject with identifier included?
1116impl PBXObjectCollection {
17+ pub ( crate ) fn set_inner ( & mut self , map : HashMap < String , PBXObject > ) {
18+ self . 0 = map;
19+ }
20+
1221 /// Add new object. same as insert but it auto create id and returns it
1322 pub fn push < O : Into < PBXObject > > ( & mut self , object : O ) -> String {
1423 let id = uuid:: Uuid :: new_v4 ( ) . to_string ( ) ;
1524 self . insert ( id. clone ( ) , object. into ( ) ) ;
1625 id
1726 }
1827
19- pub ( crate ) fn set_inner ( & mut self , map : HashMap < String , PBXObject > ) {
20- self . 0 = map;
28+ /// Get PBXTarget by reference
29+ pub fn get_target < ' a > ( & ' a self , reference : & str ) -> Option < Rc < RefCell < PBXTarget > > > {
30+ self . get ( reference) ?. as_pbx_target ( ) . map ( |r| r. clone ( ) )
2131 }
2232
23- // /// Get PBXTarget by the target name
24- // pub fn get_target_by_name<'a>(
25- // &'a self,
26- // target_name: &'a str,
27- // ) -> Option<(&'a String, Ref<'a, PBXObject>)> {
28- // self.0
29- // .iter()
30- // .find(|(_, &o)| {
31- // let target = match *o.borrow() {
32- // PBXObject::PBXAggregateTarget(ref v) => &v.inner,
33- // PBXObject::PBXLegacyTarget(ref v) => &v.inner,
34- // PBXObject::PBXNativeTarget(ref v) => &v.inner,
35- // _ => return false,
36- // };
37- // if let Some(name) = target.name.as_ref() {
38- // name == target_name
39- // } else {
40- // false
41- // }
42- // })
43- // .map(|(key, o)| (key, o.borrow()))
44- // }
33+ /// Get XCRemoteSwiftPackageReference from a vec of references
34+ pub fn get_packages_from_references < ' a > (
35+ & ' a self ,
36+ references : & Vec < String > ,
37+ ) -> Vec < ( String , Rc < RefCell < XCRemoteSwiftPackageReference > > ) > {
38+ references
39+ . iter ( )
40+ . map ( |id| {
41+ let package = self . get ( id) ?. as_xc_remote_swift_package_reference ( ) ?;
42+ Some ( ( id. clone ( ) , package. clone ( ) ) )
43+ } )
44+ . flatten ( )
45+ . collect ( )
46+ }
4547
46- // /// Get PBXTarget by reference
47- // pub fn get_target(&self, reference: &str) -> Option<&PBXObject> {
48- // if let Some(object) = self.get(reference) {
49- // if object.borrow().is_pbx_target() {
50- // return Some(Rc::downgrade(object));
51- // }
52- // None
53- // } else {
54- // None
55- // }
56- // }
48+ /// Get PBXTarget from a vec of references
49+ pub fn get_targets_from_references < ' a > (
50+ & ' a self ,
51+ references : & Vec < String > ,
52+ ) -> Vec < ( String , Rc < RefCell < PBXTarget > > ) > {
53+ references
54+ . iter ( )
55+ . map ( |id| {
56+ let target = self . get_target ( id) ?;
57+ Some ( ( id. clone ( ) , target. clone ( ) ) )
58+ } )
59+ . flatten ( )
60+ . collect ( )
61+ }
5762
58- // /// Get mutable PBXTarget by reference
59- // pub fn get_target_mut(&mut self, reference: &str) -> Option<&mut PBXObject> {
60- // if let Some(object) = self.get_mut(reference) {
61- // if object.is_pbx_target() {
62- // return Some(object);
63- // }
64- // None
65- // } else {
66- // None
67- // }
68- // }
63+ /// Get PBXTarget by the target name
64+ pub fn get_target_by_name < ' a > (
65+ & ' a self ,
66+ target_name : & ' a str ,
67+ ) -> Option < ( String , Rc < RefCell < PBXTarget > > ) > {
68+ self . iter ( )
69+ . find ( |( _, o) | {
70+ if let Some ( target) = o. as_pbx_target ( ) {
71+ if let Some ( name) = target. borrow ( ) . name . as_ref ( ) {
72+ name == target_name
73+ } else {
74+ false
75+ }
76+ } else {
77+ false
78+ }
79+ } )
80+ . map ( |( key, o) | ( key. clone ( ) , o. as_pbx_target ( ) . unwrap ( ) . clone ( ) ) )
81+ }
6982}
0 commit comments