diff --git a/Docs/Screenshots/.gitkeep b/Docs/Screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Docs/Screenshots/home.png b/Docs/Screenshots/home.png new file mode 100644 index 0000000..00d39ba Binary files /dev/null and b/Docs/Screenshots/home.png differ diff --git a/Docs/Screenshots/search.png b/Docs/Screenshots/search.png new file mode 100644 index 0000000..de5a68b Binary files /dev/null and b/Docs/Screenshots/search.png differ diff --git a/MusicBandscape.xcworkspace/contents.xcworkspacedata b/MusicBandscape.xcworkspace/contents.xcworkspacedata index 4c532d8..6b6f436 100644 --- a/MusicBandscape.xcworkspace/contents.xcworkspacedata +++ b/MusicBandscape.xcworkspace/contents.xcworkspacedata @@ -26,10 +26,10 @@ location = "group:Model/Model.xcodeproj"> + location = "group:NetworkService/NetworkService.xcodeproj"> + location = "group:Repository/Repository.xcodeproj"> + + + + diff --git a/MusicBandscape.xcworkspace/xcshareddata/xcschemes/MusicBandscape-Workspace.xcscheme b/MusicBandscape.xcworkspace/xcshareddata/xcschemes/MusicBandscape-Workspace.xcscheme index 9370e75..cf8aff0 100644 --- a/MusicBandscape.xcworkspace/xcshareddata/xcschemes/MusicBandscape-Workspace.xcscheme +++ b/MusicBandscape.xcworkspace/xcshareddata/xcschemes/MusicBandscape-Workspace.xcscheme @@ -1126,6 +1126,76 @@ ReferencedContainer = "container:Projects/App/MusicBandscape.xcodeproj"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BlueprintIdentifier = "C8340F58B0B1AD7EA1B1F833" + BuildableName = "Search.framework" + BlueprintName = "Search" + ReferencedContainer = "container:Projects/Presentation/Search/Search.xcodeproj"> + BlueprintIdentifier = "ADF6FD6557B86CF1D0D142F4" + BuildableName = "Search_Debug.framework" + BlueprintName = "Search-Debug" + ReferencedContainer = "container:Projects/Presentation/Search/Search.xcodeproj"> + BlueprintIdentifier = "BC9735B9FBE423AE69AD2C5D" + BuildableName = "Search_Prod.framework" + BlueprintName = "Search-Prod" + ReferencedContainer = "container:Projects/Presentation/Search/Search.xcodeproj"> + BlueprintIdentifier = "07BC18765727814C00E81BA3" + BuildableName = "Search_Stage.framework" + BlueprintName = "Search-Stage" + ReferencedContainer = "container:Projects/Presentation/Search/Search.xcodeproj"> + BlueprintIdentifier = "5025AE41A60E1D1B5B67EC7D" + BuildableName = "SearchTests.xctest" + BlueprintName = "SearchTests" + ReferencedContainer = "container:Projects/Presentation/Search/Search.xcodeproj"> + + + + @@ -2399,10 +2550,21 @@ parallelizable = "NO"> + BlueprintIdentifier = "5E21E9921D0FCCDAEAA45BEC" + BuildableName = "RootTabTests.xctest" + BlueprintName = "RootTabTests" + ReferencedContainer = "container:Projects/Presentation/RootTab/RootTab.xcodeproj"> + + + + Effect { switch action { case .presentMain: - state = .home(.init()) -// return .send(.scope(.mainTab(.scope(.movieCoordinator)))) + state = .tabBar(.init()) return .none } } diff --git a/Projects/App/Sources/View/AppView.swift b/Projects/App/Sources/View/AppView.swift index fc31f42..f7846c5 100644 --- a/Projects/App/Sources/View/AppView.swift +++ b/Projects/App/Sources/View/AppView.swift @@ -22,9 +22,9 @@ struct AppView: View { SplashView(store: store) } - case .home: - if let store = store.scope(state: \.home, action: \.scope.home) { - HomeCoordinatorView(store: store) + case .tabBar: + if let store = store.scope(state: \.tabBar, action: \.scope.tabBar) { + RootTabBarView(store: store) } } } diff --git a/Projects/App/Sources/View/ContentView.swift b/Projects/App/Sources/View/ContentView.swift index 1aea452..db36063 100644 --- a/Projects/App/Sources/View/ContentView.swift +++ b/Projects/App/Sources/View/ContentView.swift @@ -3,6 +3,7 @@ import Presentation import Splash import ComposableArchitecture + public struct ContentView: View { public init() {} @@ -52,3 +53,16 @@ public struct ContentView: View { }) ) } + +#Preview("검색 화면") { + SearchView(store: .init(initialState: SearchReducer.State(), reducer: { + SearchReducer() + })) +} + + +#Preview("rootTab") { + RootTabBarView(store: .init(initialState: RootTabReducer.State(), reducer: { + RootTabReducer() + })) +} diff --git a/Projects/Core/Core/Core.xcodeproj/project.pbxproj b/Projects/Core/Core/Core.xcodeproj/project.pbxproj index 745d37e..30e6677 100644 --- a/Projects/Core/Core/Core.xcodeproj/project.pbxproj +++ b/Projects/Core/Core/Core.xcodeproj/project.pbxproj @@ -22,7 +22,6 @@ 0AC161F8F43479EF47B65273 /* IssueReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03E9AE72F3054B4A5B3FA955 /* IssueReporting.framework */; }; 0B2DBBBB0D34113CBC8D6045 /* UIKitNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEC4F1585F46781177064EC7 /* UIKitNavigation.framework */; }; 0C990308784F2D3A574761BE /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 64BC3B8469A7FF9C669EFC3F /* Alamofire_Alamofire.bundle */; }; - 0EF10848EB1E5A8ED6641F12 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED045ECCC0A0126F7A4BC13 /* Service.framework */; }; 153DA734BD15A3E83170B825 /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AC2DBA35091C70DC51D960D /* Foundations.framework */; }; 193C3045681EE3E35615EEF4 /* IdentifiedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF63D412AA4B009EF483F4BE /* IdentifiedCollections.framework */; }; 197C9F3FF97991D3BCFD6149 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C59ACF63375043BBA6AB53F /* RxSwift.framework */; }; @@ -37,6 +36,7 @@ 23623C8CAA0D5B0C48DBC33E /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADD660C81381F8C73A9A8893 /* AsyncMoya.framework */; }; 23C8B915134EFE977A0AF44C /* InternalCollectionsUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12A713B47F2AAA89018EAC9F /* InternalCollectionsUtilities.framework */; }; 25331ABA2B62C93B801F42C7 /* IdentifiedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF63D412AA4B009EF483F4BE /* IdentifiedCollections.framework */; }; + 265528BBB6662B3D7B15D04A /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9E22A834A68C79CBCDEC612 /* NetworkService.framework */; }; 27ECE37DA37CDC0E38D78AEB /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA3F13E23B6662B1FDAD4536 /* CFNetwork.framework */; }; 28179AACF7CEE8F379C94168 /* IssueReportingPackageSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9297D43D2BEFCC0B514EFC04 /* IssueReportingPackageSupport.framework */; }; 283B75BE810668074615A488 /* XCTestDynamicOverlay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0E1BE020E6058D897035F31 /* XCTestDynamicOverlay.framework */; }; @@ -51,7 +51,6 @@ 3B6E24246242E5B45041A961 /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEAF02179EA24FA0AA10E102 /* EventLimiter.framework */; }; 3EF87DF18AEF093172128201 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA3F13E23B6662B1FDAD4536 /* CFNetwork.framework */; }; 4112B6136D7137512BB47137 /* SwiftNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 091619AA614A7C59B502D9D5 /* SwiftNavigation.framework */; }; - 4136091B0498B913CAF09504 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED045ECCC0A0126F7A4BC13 /* Service.framework */; }; 44EF53FEAA0FD1F604AFA623 /* CombineSchedulers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED856AD323CCEEC229B2C7F9 /* CombineSchedulers.framework */; }; 4584FA74CCA4B45BDFBC2B84 /* PerceptionCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70750465C5300D484ABA9F60 /* PerceptionCore.framework */; }; 458BC20C8B3061D32FA23B4E /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADD660C81381F8C73A9A8893 /* AsyncMoya.framework */; }; @@ -110,6 +109,7 @@ 84F29B64D24E2F2F7E7C75AF /* UIKitNavigationShim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F99CA60AD1F77541E67E93 /* UIKitNavigationShim.framework */; }; 85AE440AE710D600F1CB23EE /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEAF02179EA24FA0AA10E102 /* EventLimiter.framework */; }; 887EBC2FF03A101E2EAA63DA /* ComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB18C1565FE3EAC96777EC0F /* ComposableArchitecture.framework */; }; + 8ACC78225C9BB558C9F8F32A /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9E22A834A68C79CBCDEC612 /* NetworkService.framework */; }; 8C85E8CCC8F4BAC32A1F8956 /* ConcurrencyExtras.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10C2E0E9FA89653EBA928FFB /* ConcurrencyExtras.framework */; }; 8C935BC4799F8B6E3A6223E1 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F52A0D92C684C59849570BB /* OSLog.framework */; }; 8E227E6CDAE631A87FCFDF58 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 64BC3B8469A7FF9C669EFC3F /* Alamofire_Alamofire.bundle */; }; @@ -118,6 +118,7 @@ 908239751BB5B44F306AF1B5 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9208035A4D93E76DE8390864 /* API.framework */; }; 90F9749BFCF03B4AB847C6B1 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E427963EEC5B2C6424367BB /* Test.swift */; }; 912F15FB808EFD42963B2181 /* CasePaths.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37D454E3D3DEA3106FC5B1D9 /* CasePaths.framework */; }; + 91A25C1DC1F72D3555C333B5 /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9E22A834A68C79CBCDEC612 /* NetworkService.framework */; }; 91CA37E449BC98542266178B /* Sharing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E7A1228CBFFBBC21B6F7108 /* Sharing.framework */; }; 928BF1612A4C4B5382E83F0A /* ConcurrencyExtras.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10C2E0E9FA89653EBA928FFB /* ConcurrencyExtras.framework */; }; 9759622C07EB4108F92C7BFC /* CasePathsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FFF727FDBE22876C8AC9A3D /* CasePathsCore.framework */; }; @@ -145,11 +146,11 @@ BAC14B2B430CF2FEC6001708 /* XCTestDynamicOverlay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0E1BE020E6058D897035F31 /* XCTestDynamicOverlay.framework */; }; BB7607FFD4AFB70D473FF4FA /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B99D7CBDD38E8D23D59A25 /* CombineMoya.framework */; }; BC8595A1E286E2F5B6EF15C9 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B0FA7F85F3573FB522F9478 /* Core.framework */; }; + BD7829308C3714E53A78DBB0 /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9E22A834A68C79CBCDEC612 /* NetworkService.framework */; }; BDB24F99EF91F73F88E48FDB /* DataInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCA4FDADB9D94372F0DF1DAB /* DataInterface.framework */; }; BDF58A4C856FFC3CBE67FBBD /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABF88C39763A84B856476973 /* LogMacro.framework */; }; BE2A82C9C8D2B6E2E0078C59 /* Clocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE351E328C333744FEAAACEF /* Clocks.framework */; }; BF97AB1F1286F02D88CDF7BF /* CustomDump.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6739389F41AD55401939AA3 /* CustomDump.framework */; }; - C1234BEE27DE517F8CE3A864 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED045ECCC0A0126F7A4BC13 /* Service.framework */; }; C19440D7C9DE70C6EDF16A45 /* Sharing1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 141E57E374A54F7AB6E29DC2 /* Sharing1.framework */; }; C4B19E5C873780D6AA661A00 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C59ACF63375043BBA6AB53F /* RxSwift.framework */; }; C670CC47F85EAD32C8DDD147 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC0E7A7D8E049C47C0D8DBAF /* RxMoya.framework */; }; @@ -166,7 +167,6 @@ D1B3E19A5BAFD54933477B6F /* ComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB18C1565FE3EAC96777EC0F /* ComposableArchitecture.framework */; }; D35EE132FCBD9B30CFA96C65 /* Clocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE351E328C333744FEAAACEF /* Clocks.framework */; }; D67B83859DB2A4BC50429596 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B99D7CBDD38E8D23D59A25 /* CombineMoya.framework */; }; - D6FB16CDB69D52FF171AE043 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED045ECCC0A0126F7A4BC13 /* Service.framework */; }; D807263AF515DA4FF704F991 /* Perception.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F8CC6237F3D4AE8F77CAE48 /* Perception.framework */; }; D8D02BB84AD77216D6013F99 /* Sharing1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 141E57E374A54F7AB6E29DC2 /* Sharing1.framework */; }; D8D0B2291F7B85620B6DC4BF /* PerceptionCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70750465C5300D484ABA9F60 /* PerceptionCore.framework */; }; @@ -285,7 +285,6 @@ 2B0FA7F85F3573FB522F9478 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 37D454E3D3DEA3106FC5B1D9 /* CasePaths.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CasePaths.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3E313EC3E53C9ED17660FD3F /* CoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3ED045ECCC0A0126F7A4BC13 /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3F9C516A0389461EC9B5D46E /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3FFF727FDBE22876C8AC9A3D /* CasePathsCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CasePathsCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4A672C80AC40AD7ADFD38507 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -327,6 +326,7 @@ DE81E51C38BC7DF49AD255BD /* UseCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UseCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DEB3C68C2ED81026636D7F75 /* CoreExport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreExport.swift; sourceTree = ""; }; DF63D412AA4B009EF483F4BE /* IdentifiedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IdentifiedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E9E22A834A68C79CBCDEC612 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ED856AD323CCEEC229B2C7F9 /* CombineSchedulers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineSchedulers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EEAF02179EA24FA0AA10E102 /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FC6EA3166EAE3B4E5C3A3655 /* OrderedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -365,6 +365,7 @@ BDF58A4C856FFC3CBE67FBBD /* LogMacro.framework in Frameworks */, 9FBB462562FD1381FCB33831 /* Model.framework in Frameworks */, 7EDF61ED9570CCFAE8A34322 /* Moya.framework in Frameworks */, + 91A25C1DC1F72D3555C333B5 /* NetworkService.framework in Frameworks */, 774D915DCAFDDA823F514A4D /* Networking.framework in Frameworks */, 581BA75F50FE6547B2732D10 /* OrderedCollections.framework in Frameworks */, 7F1A303924CE85716B92157B /* Perception.framework in Frameworks */, @@ -372,7 +373,6 @@ 0ABD067AC835C34B144A119C /* Repository.framework in Frameworks */, 9B78C94AA0A23A21657A19F1 /* RxMoya.framework in Frameworks */, E332090F0D2AF223B729735D /* RxSwift.framework in Frameworks */, - D6FB16CDB69D52FF171AE043 /* Service.framework in Frameworks */, 6ADBD1397C6A44688E9A4170 /* Sharing.framework in Frameworks */, 1A4CE5864E3E0A793F262D04 /* Sharing1.framework in Frameworks */, 2E139BFE929C679F3FA93456 /* Sharing2.framework in Frameworks */, @@ -416,6 +416,7 @@ B49C0C48B313FA48AB6B5397 /* LogMacro.framework in Frameworks */, 796E9382BC2BE4D1E6889FD7 /* Model.framework in Frameworks */, 73588A177644EDE0C3A5C627 /* Moya.framework in Frameworks */, + 8ACC78225C9BB558C9F8F32A /* NetworkService.framework in Frameworks */, 52B4AD0DF0AC04F86A07FB86 /* Networking.framework in Frameworks */, 53CBEAA13C914C361402B056 /* OrderedCollections.framework in Frameworks */, 666209C52E74FB8C6EFA853B /* Perception.framework in Frameworks */, @@ -423,7 +424,6 @@ 70D5DB78FC01271FA17127DB /* Repository.framework in Frameworks */, C670CC47F85EAD32C8DDD147 /* RxMoya.framework in Frameworks */, F6AAD53AE5AF84CA56570AE1 /* RxSwift.framework in Frameworks */, - C1234BEE27DE517F8CE3A864 /* Service.framework in Frameworks */, F965D44749FBCF0F5B2DA464 /* Sharing.framework in Frameworks */, C19440D7C9DE70C6EDF16A45 /* Sharing1.framework in Frameworks */, 7E0F7A2E919A8E3E252C6E5E /* Sharing2.framework in Frameworks */, @@ -467,6 +467,7 @@ 822DF876BB668FF81689C7E4 /* LogMacro.framework in Frameworks */, 7A83E67FEDA6E2128A0DBE82 /* Model.framework in Frameworks */, 78DE9E2870EA091066A98F3E /* Moya.framework in Frameworks */, + BD7829308C3714E53A78DBB0 /* NetworkService.framework in Frameworks */, 73E8511D2CFD4034A1050AA0 /* Networking.framework in Frameworks */, 30C165DDDBA521864ADED55A /* OrderedCollections.framework in Frameworks */, D807263AF515DA4FF704F991 /* Perception.framework in Frameworks */, @@ -474,7 +475,6 @@ E5D416E83E8404C167333304 /* Repository.framework in Frameworks */, 07897CF48250E12FD0CDDABF /* RxMoya.framework in Frameworks */, C4B19E5C873780D6AA661A00 /* RxSwift.framework in Frameworks */, - 4136091B0498B913CAF09504 /* Service.framework in Frameworks */, 91CA37E449BC98542266178B /* Sharing.framework in Frameworks */, D8D02BB84AD77216D6013F99 /* Sharing1.framework in Frameworks */, 0A6F0AAF346955B125A6D78E /* Sharing2.framework in Frameworks */, @@ -518,6 +518,7 @@ C6A9D0FB7BC398F04CF131AE /* LogMacro.framework in Frameworks */, C9DC1FC3181E0BCA557D445D /* Model.framework in Frameworks */, CD5695821CEC5EAC1D117155 /* Moya.framework in Frameworks */, + 265528BBB6662B3D7B15D04A /* NetworkService.framework in Frameworks */, 65D9C904FC575380ED1A65F6 /* Networking.framework in Frameworks */, 02C8AC5E9D8916ADD6307109 /* OrderedCollections.framework in Frameworks */, C817E90B41D7B129CAAF83C4 /* Perception.framework in Frameworks */, @@ -525,7 +526,6 @@ FA3AE178AFC2EC94AE27EDDF /* Repository.framework in Frameworks */, 5320D016B9469C3BA540AC1B /* RxMoya.framework in Frameworks */, 197C9F3FF97991D3BCFD6149 /* RxSwift.framework in Frameworks */, - 0EF10848EB1E5A8ED6641F12 /* Service.framework in Frameworks */, AD8CB953E5D441B8542F4323 /* Sharing.framework in Frameworks */, 8460A0263EB5BB299A2ABD2E /* Sharing1.framework in Frameworks */, 543E087427D4A8420C2134C1 /* Sharing2.framework in Frameworks */, @@ -600,13 +600,13 @@ 3F9C516A0389461EC9B5D46E /* Model.framework */, 6260F75C087362295DDE52AE /* Moya.framework */, 69722B72879FA3302F07EF38 /* Networking.framework */, + E9E22A834A68C79CBCDEC612 /* NetworkService.framework */, FC6EA3166EAE3B4E5C3A3655 /* OrderedCollections.framework */, 1F8CC6237F3D4AE8F77CAE48 /* Perception.framework */, 70750465C5300D484ABA9F60 /* PerceptionCore.framework */, A6B638D8DB02624DD45D49E2 /* Repository.framework */, AC0E7A7D8E049C47C0D8DBAF /* RxMoya.framework */, 6C59ACF63375043BBA6AB53F /* RxSwift.framework */, - 3ED045ECCC0A0126F7A4BC13 /* Service.framework */, 4E7A1228CBFFBBC21B6F7108 /* Sharing.framework */, 141E57E374A54F7AB6E29DC2 /* Sharing1.framework */, 2690CFF7D8527FFE80ABE74D /* Sharing2.framework */, diff --git a/Projects/Core/Data/DataInterface/DataInterface.xcodeproj/project.pbxproj b/Projects/Core/Data/DataInterface/DataInterface.xcodeproj/project.pbxproj index 78eaf9f..25f422a 100644 --- a/Projects/Core/Data/DataInterface/DataInterface.xcodeproj/project.pbxproj +++ b/Projects/Core/Data/DataInterface/DataInterface.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ @@ -14,15 +14,15 @@ 5B20A84AC1E129B86D1B4E6D /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1E1C0477536B6ADA014FE8 /* Test.swift */; }; 62709A2606CACE187E695F0F /* DataInterfaceExported.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B4EE422C6BDF1092569EFBE /* DataInterfaceExported.swift */; }; 740D0895932BCEC508B46E55 /* DataInterfaceExported.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B4EE422C6BDF1092569EFBE /* DataInterfaceExported.swift */; }; - 7F1AC7292EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */; }; - 7F1AC72A2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */; }; - 7F1AC72B2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */; }; - 7F1AC72C2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */; }; + 7A13D2C05B242D5A24B9AC3A /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */; }; 856868F5062A841E55BC418C /* MusicSearchRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3BA308B30101EEC71E16F6 /* MusicSearchRepositoryProtocol.swift */; }; + 9850DC711D2C7547E950347F /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */; }; 9D3E93041916AC43128C9A07 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0883D5D36210798EE6A8723 /* Model.framework */; }; + A23919CE068BFAFA82D6DB62 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */; }; A878759C9D55CE7F06A93989 /* MusicSearchRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3BA308B30101EEC71E16F6 /* MusicSearchRepositoryProtocol.swift */; }; AFF879F6BB1B0481DFAA9662 /* MusicSearchRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3BA308B30101EEC71E16F6 /* MusicSearchRepositoryProtocol.swift */; }; B31B321ED8D7BCF199CACE3D /* MusicSearchRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC3BA308B30101EEC71E16F6 /* MusicSearchRepositoryProtocol.swift */; }; + B94D45AA6CCA898197E9FBC3 /* MusicDetailRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */; }; D0EAC38B2859EDF62A580653 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B0883D5D36210798EE6A8723 /* Model.framework */; }; E18B0AE27410B4BED0F4B68A /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B0883D5D36210798EE6A8723 /* Model.framework */; }; ED6C9407A2FC3B095C3CF271 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B0883D5D36210798EE6A8723 /* Model.framework */; }; @@ -137,7 +137,6 @@ 1B4EE422C6BDF1092569EFBE /* DataInterfaceExported.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataInterfaceExported.swift; sourceTree = ""; }; 47E60E5F70543438834B1B29 /* DataInterface-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DataInterface-Prod-Info.plist"; sourceTree = ""; }; 6A88F55149AF95EB216E8E4B /* DataInterface_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DataInterface_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailRepositoryProtocol.swift; sourceTree = ""; }; 8867B26BFB94DB9064D550A6 /* DataInterfaceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DataInterfaceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 981778211ECAE8C9F3519723 /* DataInterface-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DataInterface-Stage-Info.plist"; sourceTree = ""; }; B0883D5D36210798EE6A8723 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -145,6 +144,7 @@ C4588FFF4FA1A9F35AB3D39B /* DataInterface_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DataInterface_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D41877E7A655281D9C631C30 /* DataInterfaceTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DataInterfaceTests-Info.plist"; sourceTree = ""; }; DEFA4D170743668E55DC05FB /* DataInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DataInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailRepositoryProtocol.swift; sourceTree = ""; }; ECA1B12DCBFAC18CA7BB1CAF /* DataInterface-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DataInterface-Debug-Info.plist"; sourceTree = ""; }; FA1E1C0477536B6ADA014FE8 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -248,8 +248,8 @@ F5C64B89EAABF4CDCBD2F2D1 /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC7282EB44D6900C82441 /* MusicDetailRepositoryProtocol.swift */, FA220A1DB1B1B5FC5B819578 /* Exported */, + EB2756AB5036C76D90D59527 /* MusicDetailRepositoryProtocol.swift */, BC3BA308B30101EEC71E16F6 /* MusicSearchRepositoryProtocol.swift */, ); path = Sources; @@ -390,6 +390,8 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; }; buildConfigurationList = A05AC6214B7656319D995795 /* Build configuration list for PBXProject "DataInterface" */; compatibilityVersion = "Xcode 14.0"; @@ -465,7 +467,7 @@ buildActionMask = 2147483647; files = ( 62709A2606CACE187E695F0F /* DataInterfaceExported.swift in Sources */, - 7F1AC72B2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */, + A23919CE068BFAFA82D6DB62 /* MusicDetailRepositoryProtocol.swift in Sources */, AFF879F6BB1B0481DFAA9662 /* MusicSearchRepositoryProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -475,7 +477,7 @@ buildActionMask = 2147483647; files = ( 740D0895932BCEC508B46E55 /* DataInterfaceExported.swift in Sources */, - 7F1AC72C2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */, + B94D45AA6CCA898197E9FBC3 /* MusicDetailRepositoryProtocol.swift in Sources */, B31B321ED8D7BCF199CACE3D /* MusicSearchRepositoryProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -485,7 +487,7 @@ buildActionMask = 2147483647; files = ( 36DB32E2003952DFD64DDB8A /* DataInterfaceExported.swift in Sources */, - 7F1AC72A2EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */, + 7A13D2C05B242D5A24B9AC3A /* MusicDetailRepositoryProtocol.swift in Sources */, A878759C9D55CE7F06A93989 /* MusicSearchRepositoryProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -495,7 +497,7 @@ buildActionMask = 2147483647; files = ( 54C61C91CF82013A39EA6247 /* DataInterfaceExported.swift in Sources */, - 7F1AC7292EB44D7700C82441 /* MusicDetailRepositoryProtocol.swift in Sources */, + 9850DC711D2C7547E950347F /* MusicDetailRepositoryProtocol.swift in Sources */, 856868F5062A841E55BC418C /* MusicSearchRepositoryProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -620,7 +622,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -791,7 +796,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -879,7 +887,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -914,7 +925,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -941,7 +955,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Projects/Core/Data/DataInterface/Sources/MusicSearchRepositoryProtocol.swift b/Projects/Core/Data/DataInterface/Sources/MusicSearchRepositoryProtocol.swift index 75a8e36..97c3e4b 100644 --- a/Projects/Core/Data/DataInterface/Sources/MusicSearchRepositoryProtocol.swift +++ b/Projects/Core/Data/DataInterface/Sources/MusicSearchRepositoryProtocol.swift @@ -10,4 +10,5 @@ import Model public protocol MusicSearchRepositoryProtocol: Sendable { func fetchMusic(search: String) async throws -> [ITunesTrack] + func searchMedia(query: String, media: String, entity: String) async throws -> [ITunesTrack] } diff --git a/Projects/Core/Data/Model/Sources/ITunesSearchResponseDTO.swift b/Projects/Core/Data/Model/Sources/ITunesSearchResponseDTO.swift index d4f65d1..2f13ba6 100644 --- a/Projects/Core/Data/Model/Sources/ITunesSearchResponseDTO.swift +++ b/Projects/Core/Data/Model/Sources/ITunesSearchResponseDTO.swift @@ -19,18 +19,18 @@ public struct ITunesTrack: Decodable { public let artistId: Int? public let collectionId: Int? - public let trackId: Int + public let trackId: Int? - public let artistName: String + public let artistName: String? public let collectionName: String? - public let trackName: String + public let trackName: String? public let previewUrl: URL? public let artworkUrl100: URL? - public let releaseDate: String - public let primaryGenreName: String - public let collectionCensoredName: String + public let releaseDate: String? + public let primaryGenreName: String? + public let collectionCensoredName: String? enum CodingKeys: String, CodingKey { case wrapperType, kind, artistId, collectionId, trackId @@ -44,15 +44,15 @@ public struct ITunesTrack: Decodable { kind: String?, artistId: Int?, collectionId: Int?, - trackId: Int, - artistName: String, + trackId: Int?, + artistName: String?, collectionName: String?, - trackName: String, + trackName: String?, previewUrl: URL?, artworkUrl100: URL?, - releaseDate: String, - primaryGenreName: String, - collectionCensoredName: String + releaseDate: String?, + primaryGenreName: String?, + collectionCensoredName: String? ) { self.wrapperType = wrapperType self.kind = kind diff --git a/Projects/Core/Data/Service/Derived/InfoPlists/Service-Debug-Info.plist b/Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Debug-Info.plist similarity index 100% rename from Projects/Core/Data/Service/Derived/InfoPlists/Service-Debug-Info.plist rename to Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Debug-Info.plist diff --git a/Projects/Core/Data/Service/Derived/InfoPlists/Service-Info.plist b/Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Info.plist similarity index 100% rename from Projects/Core/Data/Service/Derived/InfoPlists/Service-Info.plist rename to Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Info.plist diff --git a/Projects/Core/Data/Service/Derived/InfoPlists/Service-Prod-Info.plist b/Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Prod-Info.plist similarity index 100% rename from Projects/Core/Data/Service/Derived/InfoPlists/Service-Prod-Info.plist rename to Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Prod-Info.plist diff --git a/Projects/Core/Data/Service/Derived/InfoPlists/Service-Stage-Info.plist b/Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Stage-Info.plist similarity index 100% rename from Projects/Core/Data/Service/Derived/InfoPlists/Service-Stage-Info.plist rename to Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkService-Stage-Info.plist diff --git a/Projects/Core/Data/Service/Derived/InfoPlists/ServiceTests-Info.plist b/Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkServiceTests-Info.plist similarity index 100% rename from Projects/Core/Data/Service/Derived/InfoPlists/ServiceTests-Info.plist rename to Projects/Core/Data/NetworkService/Derived/InfoPlists/NetworkServiceTests-Info.plist diff --git a/Projects/Core/Data/Service/Service.xcodeproj/project.pbxproj b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/project.pbxproj similarity index 60% rename from Projects/Core/Data/Service/Service.xcodeproj/project.pbxproj rename to Projects/Core/Data/NetworkService/NetworkService.xcodeproj/project.pbxproj index ea6935a..4b5694d 100644 --- a/Projects/Core/Data/Service/Service.xcodeproj/project.pbxproj +++ b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/project.pbxproj @@ -7,53 +7,53 @@ objects = { /* Begin PBXBuildFile section */ - 08F22BF5A4AA52A128BB1B82 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */; }; - 08F77FD6DE4E215DD4E32A64 /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6540F18A92242DF633B90D64 /* API.framework */; }; - 19D2E5C34F726418AFE71E01 /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6540F18A92242DF633B90D64 /* API.framework */; }; - 22D242B134F5B6A8A32E15BF /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D14E81046E0EDA166110285 /* RxMoya.framework */; }; - 3C3DA87E8BECAB9DDB4BCB5D /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EDFE229DFD7957E8AC64F6F /* Service.framework */; }; - 3E3708439743A2C547ED2492 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */; }; - 4076084473C31650E202BE04 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27118BD665B186D6882DF66A /* LogMacro.framework */; }; - 47FC5E42D9834B9396DCEBAC /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6540F18A92242DF633B90D64 /* API.framework */; }; - 4E826607AE71154E5DED8059 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB5D0A50675F4214269A1E8C /* Moya.framework */; }; - 5E8F9B07396157DD468615A9 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A05329346434BB988BB12F74 /* Networking.framework */; }; - 60E5E8A6990835086C9E8E06 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 829B01728ED34A27080BAED0 /* Alamofire_Alamofire.bundle */; }; - 61316F3746EFE6C53038DE45 /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A05329346434BB988BB12F74 /* Networking.framework */; }; - 6C6ED816C134180808202765 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC1B5EDC0770CED17685915E /* CFNetwork.framework */; }; - 6D0EFA0CE8F5AF49C82D441B /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A02CA37CD5135A269A3E8B4C /* EventLimiter.framework */; }; - 7CCC2AF836AA226F43D96D69 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EBD9486798A0D863BB013E5 /* OSLog.framework */; }; - 80EFAB8A52BEA669C1B9F4D2 /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */; }; - 8279A0344BCCCB23F8D07ADA /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA233B5E4422F71B1E2790B8 /* Test.swift */; }; - 843C6AEBBD6B72FD0CD8CA69 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */; }; - 889DD39EC5C731443684AAF0 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */; }; - 8F0B075E16F581A93F0F2950 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */; }; - 8FC02317926D2E1626741F28 /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E5F4A58F852E3E9AB2C612B /* Foundations.framework */; }; - 929618209892E127DBC393C4 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */; }; - 94692EDF2CEFD2E8ABCB552C /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 829B01728ED34A27080BAED0 /* Alamofire_Alamofire.bundle */; }; - 994173BFEE3E0BD171E595D5 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E21A286E6E06F7B25DE62E94 /* RxSwift.framework */; }; - 9C463465532AB05D8FCE2664 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6540F18A92242DF633B90D64 /* API.framework */; }; - A1DEAC5E79ADE9B898A29434 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4252AD026DC875E998C68C29 /* CombineMoya.framework */; }; - A38E04F1E3342BDAFF6EAD94 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */; }; - A518AF62E3434BFA01D26682 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A05329346434BB988BB12F74 /* Networking.framework */; }; - CF6860A22642142D4D681090 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F25124380C7599FF946C2474 /* Alamofire.framework */; }; - D8375EA81533102047B7F323 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A05329346434BB988BB12F74 /* Networking.framework */; }; - EEE15AEC0E9C888A589038F7 /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6540F18A92242DF633B90D64 /* API.framework */; }; - F57FEB886529599781347F1A /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A05329346434BB988BB12F74 /* Networking.framework */; }; - FBD23A1822182F559DFBDC36 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */; }; + 06C62B37DAE3E7A8A10359E3 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 410749FD17EF1E79098807D7 /* OSLog.framework */; }; + 256613891D079023B15E9346 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 44122DC4B6F556140219BA7D /* Alamofire_Alamofire.bundle */; }; + 2CDD2913BE60D8B92847E594 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 51954E9BB4C2900ADA1E155A /* Networking.framework */; }; + 2D36AB06BE7532A15EB82D13 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32C0B2F077329E24DE679921 /* RxMoya.framework */; }; + 3D7C3B0EC594A80A20593113 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4783C5C51D565D8F1735054 /* API.framework */; }; + 4237FD4C49A37B11C3F9DCE9 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */; }; + 425B500FCFEBF113AC95343E /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */; }; + 4D54851289313C057446DB13 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8C1F00AFF12186DA88082E3 /* CFNetwork.framework */; }; + 4F21274421EECBF60D69C16A /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A4783C5C51D565D8F1735054 /* API.framework */; }; + 52C0466851B63CED0F5D8A0D /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4241B2F482B5AE34627909C /* AsyncMoya.framework */; }; + 5815C9DB81013175544F3E98 /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADC9183B12D666BFB5351F52 /* NetworkService.framework */; }; + 6184D7DDA99137A267158319 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E89F30252915F82C20E583E6 /* Alamofire.framework */; }; + 65776F13CF7279661AC15BFA /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 373E04407C0147EA95C44A93 /* Moya.framework */; }; + 6623DF57C28E352A9E004962 /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73A19A2C6007C206E0EFE3BA /* EventLimiter.framework */; }; + 6F296AF9924D9584B8BDEC87 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9896C9A0EC78FD9461730D0 /* CombineMoya.framework */; }; + 73919BE18D79ACF07833CDE2 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF902E302B94F1E25D072003 /* Test.swift */; }; + 753FBD956F0AE89745BEB2CF /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D4241B2F482B5AE34627909C /* AsyncMoya.framework */; }; + 780CFC5E382460615CAE94C6 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 403A6EA2F4546033A843F13D /* LogMacro.framework */; }; + 794D8AF0D650778BA96410B9 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 51954E9BB4C2900ADA1E155A /* Networking.framework */; }; + 7E3AFD86BCB7BA9B6493D402 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D4241B2F482B5AE34627909C /* AsyncMoya.framework */; }; + 81AF7D6F933F8355218DF51B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 44122DC4B6F556140219BA7D /* Alamofire_Alamofire.bundle */; }; + 8F5AF3D1F2D6B9705BF609F8 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27A6E7AF7B9AC6FAE949AB9D /* RxSwift.framework */; }; + 94EE234257B5E19EB58A2F3A /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */; }; + 982E8B39F6863B16B5A3750E /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AA9EE93E288D43FFC77A8FC /* Foundations.framework */; }; + 9A248FE58BF6525B392885D9 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 51954E9BB4C2900ADA1E155A /* Networking.framework */; }; + AFC1224ABA81A9E751060561 /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51954E9BB4C2900ADA1E155A /* Networking.framework */; }; + C0BC011492D233F9A769B25B /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D4241B2F482B5AE34627909C /* AsyncMoya.framework */; }; + CAA8A251419C0E1F319BF4C8 /* MusicSearchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */; }; + CBBD7AC0A2BA44456E857504 /* AsyncMoya.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D4241B2F482B5AE34627909C /* AsyncMoya.framework */; }; + CBCF9AD685692F24D5ADDAA2 /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A4783C5C51D565D8F1735054 /* API.framework */; }; + D86AE8A3DC6F21671A6740CA /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A4783C5C51D565D8F1735054 /* API.framework */; }; + E8BF229477577F8939257E15 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 51954E9BB4C2900ADA1E155A /* Networking.framework */; }; + FCD2CAD6CEA998CF3BA22C1E /* API.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A4783C5C51D565D8F1735054 /* API.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - E6E9DF8F0EEA2CFC49A3B0CB /* PBXContainerItemProxy */ = { + 77BA0D117672E7DC1BE27729 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 2387D8980C051CCC13E9F55A /* Project object */; + containerPortal = EB3FED4C698FF2A4ADFEA857 /* Project object */; proxyType = 1; - remoteGlobalIDString = F2B641F230465A1CF012FDED; - remoteInfo = Service; + remoteGlobalIDString = 453323209A3FFF1E78EECE5D; + remoteInfo = NetworkService; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 11D2D814492A2F170FB62D24 /* Embed Frameworks */ = { + 0A3989CDACDDC1DD1E36CF4E /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -63,29 +63,41 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 2E2613D1F1E4C4DEE2BD94FF /* Dependencies */ = { + 5C9B28B66514B447E40AF6A9 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 6BB2625AEFA4E1B157C46F4E /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstSubfolderSpec = 16; files = ( - 60E5E8A6990835086C9E8E06 /* Alamofire_Alamofire.bundle in Dependencies */, + 4F21274421EECBF60D69C16A /* API.framework in Dependencies */, + 7E3AFD86BCB7BA9B6493D402 /* AsyncMoya.framework in Dependencies */, + 9A248FE58BF6525B392885D9 /* Networking.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; - 43672DB00161FEA57F65B408 /* Dependencies */ = { + 6D2C95A7B7A1D464C4D73C4D /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstSubfolderSpec = 16; files = ( - 08F77FD6DE4E215DD4E32A64 /* API.framework in Dependencies */, - 08F22BF5A4AA52A128BB1B82 /* AsyncMoya.framework in Dependencies */, - A518AF62E3434BFA01D26682 /* Networking.framework in Dependencies */, + CBCF9AD685692F24D5ADDAA2 /* API.framework in Dependencies */, + CBBD7AC0A2BA44456E857504 /* AsyncMoya.framework in Dependencies */, + 794D8AF0D650778BA96410B9 /* Networking.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; - 5A4B9E41609D6261A34EF004 /* Embed Frameworks */ = { + 8343B143D49F41584DF9676A /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -95,7 +107,7 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 5B36A939A245B5A27F657AD1 /* Embed Frameworks */ = { + A4317292F5A1DE2135F74C6F /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -105,41 +117,41 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 7916ECC01EDD8BCB71C5F2CE /* Embed Frameworks */ = { + B012FE4FB60FF95D41D43EA6 /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; + buildActionMask = 8; + dstSubfolderSpec = 16; files = ( + D86AE8A3DC6F21671A6740CA /* API.framework in Dependencies */, + 753FBD956F0AE89745BEB2CF /* AsyncMoya.framework in Dependencies */, + 2CDD2913BE60D8B92847E594 /* Networking.framework in Dependencies */, ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; }; - 7B31AB9DAB84DF68E142679F /* Dependencies */ = { + B1F1DBD91319E398A8C906EE /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstSubfolderSpec = 16; files = ( - EEE15AEC0E9C888A589038F7 /* API.framework in Dependencies */, - A38E04F1E3342BDAFF6EAD94 /* AsyncMoya.framework in Dependencies */, - 5E8F9B07396157DD468615A9 /* Networking.framework in Dependencies */, + FCD2CAD6CEA998CF3BA22C1E /* API.framework in Dependencies */, + C0BC011492D233F9A769B25B /* AsyncMoya.framework in Dependencies */, + E8BF229477577F8939257E15 /* Networking.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; - D2E9552C3D1506E8E42EB8ED /* Dependencies */ = { + BD42D38CED5A1430CEAF5321 /* Dependencies */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 8; dstSubfolderSpec = 16; files = ( - 19D2E5C34F726418AFE71E01 /* API.framework in Dependencies */, - 8F0B075E16F581A93F0F2950 /* AsyncMoya.framework in Dependencies */, - F57FEB886529599781347F1A /* Networking.framework in Dependencies */, + 81AF7D6F933F8355218DF51B /* Alamofire_Alamofire.bundle in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; }; - E135B70B4BAD281F11E29459 /* Embed Frameworks */ = { + F4165CBA29B202002CFAD1D1 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -149,318 +161,306 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - E9A743867ABF14264AA4F46D /* Dependencies */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 8; - dstSubfolderSpec = 16; - files = ( - 47FC5E42D9834B9396DCEBAC /* API.framework in Dependencies */, - 929618209892E127DBC393C4 /* AsyncMoya.framework in Dependencies */, - D8375EA81533102047B7F323 /* Networking.framework in Dependencies */, - ); - name = Dependencies; - runOnlyForDeploymentPostprocessing = 1; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 00FFF298924B1BF14FBF4331 /* Service-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Service-Prod-Info.plist"; sourceTree = ""; }; - 259ABF995B5D27470E829C10 /* ServiceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ServiceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 27118BD665B186D6882DF66A /* LogMacro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LogMacro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchService.swift; sourceTree = ""; }; - 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 34D19142035B122118FB9153 /* ServiceTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "ServiceTests-Info.plist"; sourceTree = ""; }; - 3E5F4A58F852E3E9AB2C612B /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4252AD026DC875E998C68C29 /* CombineMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 49AE8778D00783FC72E9C397 /* Service_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5D14E81046E0EDA166110285 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6540F18A92242DF633B90D64 /* API.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = API.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 656243C0336CD9A5FB069256 /* Service_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74A1B62620FE2F19FABD7BF1 /* Service-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Service-Debug-Info.plist"; sourceTree = ""; }; - 79814A227CE0F11AA0C03131 /* Service-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Service-Info.plist"; sourceTree = ""; }; - 7EDFE229DFD7957E8AC64F6F /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 829B01728ED34A27080BAED0 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 8EBD9486798A0D863BB013E5 /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OSLog.framework; sourceTree = DEVELOPER_DIR; }; - A02CA37CD5135A269A3E8B4C /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A05329346434BB988BB12F74 /* Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B432785FB9ED34C4A18C0C4C /* Service_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BA233B5E4422F71B1E2790B8 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; - CB5D0A50675F4214269A1E8C /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D066B46F236811258B579745 /* Service-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Service-Stage-Info.plist"; sourceTree = ""; }; - E21A286E6E06F7B25DE62E94 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EC1B5EDC0770CED17685915E /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - F25124380C7599FF946C2474 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 02BA9A9ACC792930C2249570 /* NetworkService_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 27A6E7AF7B9AC6FAE949AB9D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 32C0B2F077329E24DE679921 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 373E04407C0147EA95C44A93 /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 403A6EA2F4546033A843F13D /* LogMacro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LogMacro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 410749FD17EF1E79098807D7 /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OSLog.framework; sourceTree = DEVELOPER_DIR; }; + 44122DC4B6F556140219BA7D /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 497909CEF58B222EE966AD45 /* NetworkService-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "NetworkService-Debug-Info.plist"; sourceTree = ""; }; + 51954E9BB4C2900ADA1E155A /* Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchService.swift; sourceTree = ""; }; + 64DF117A648F822D059C86FC /* NetworkServiceTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "NetworkServiceTests-Info.plist"; sourceTree = ""; }; + 73A19A2C6007C206E0EFE3BA /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AA9EE93E288D43FFC77A8FC /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F5526A4FFA664BE907263C9 /* NetworkServiceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NetworkServiceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + A4783C5C51D565D8F1735054 /* API.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = API.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AB54C057D5062D9B7A0C22FB /* NetworkService_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ADC9183B12D666BFB5351F52 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B1310DBB206F80EC21166002 /* NetworkService-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "NetworkService-Prod-Info.plist"; sourceTree = ""; }; + C463F8FAE8AE26DF76BDB73C /* NetworkService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "NetworkService-Info.plist"; sourceTree = ""; }; + D4241B2F482B5AE34627909C /* AsyncMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D641E594C539D5B19596E9A1 /* NetworkService_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D8C1F00AFF12186DA88082E3 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + E89F30252915F82C20E583E6 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F146C68FE886FBBF938BE28A /* NetworkService-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "NetworkService-Stage-Info.plist"; sourceTree = ""; }; + F9896C9A0EC78FD9461730D0 /* CombineMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FF902E302B94F1E25D072003 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 34B55B2B9613E5178446EFC1 /* Frameworks */ = { + 15D2458E3FC3494C8CDA33E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 4E5B44339E15D9D7286508BD /* Frameworks */ = { + 25FE99C35CE0963B40554522 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - B9E255F78ED125E38CFE6433 /* Frameworks */ = { + 8C85EE6DC8E2BCD3916C1911 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - E46B5D6AB1628CA99D638546 /* Frameworks */ = { + BEFEF37BF6E8106043D3C0BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - ED4007158FAD7C7CFF0D3491 /* Frameworks */ = { + FD0B822481C7DFC72D8E42F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6C6ED816C134180808202765 /* CFNetwork.framework in Frameworks */, - 7CCC2AF836AA226F43D96D69 /* OSLog.framework in Frameworks */, - 9C463465532AB05D8FCE2664 /* API.framework in Frameworks */, - CF6860A22642142D4D681090 /* Alamofire.framework in Frameworks */, - 80EFAB8A52BEA669C1B9F4D2 /* AsyncMoya.framework in Frameworks */, - A1DEAC5E79ADE9B898A29434 /* CombineMoya.framework in Frameworks */, - 6D0EFA0CE8F5AF49C82D441B /* EventLimiter.framework in Frameworks */, - 8FC02317926D2E1626741F28 /* Foundations.framework in Frameworks */, - 4076084473C31650E202BE04 /* LogMacro.framework in Frameworks */, - 4E826607AE71154E5DED8059 /* Moya.framework in Frameworks */, - 61316F3746EFE6C53038DE45 /* Networking.framework in Frameworks */, - 22D242B134F5B6A8A32E15BF /* RxMoya.framework in Frameworks */, - 994173BFEE3E0BD171E595D5 /* RxSwift.framework in Frameworks */, - 3C3DA87E8BECAB9DDB4BCB5D /* Service.framework in Frameworks */, + 4D54851289313C057446DB13 /* CFNetwork.framework in Frameworks */, + 06C62B37DAE3E7A8A10359E3 /* OSLog.framework in Frameworks */, + 3D7C3B0EC594A80A20593113 /* API.framework in Frameworks */, + 6184D7DDA99137A267158319 /* Alamofire.framework in Frameworks */, + 52C0466851B63CED0F5D8A0D /* AsyncMoya.framework in Frameworks */, + 6F296AF9924D9584B8BDEC87 /* CombineMoya.framework in Frameworks */, + 6623DF57C28E352A9E004962 /* EventLimiter.framework in Frameworks */, + 982E8B39F6863B16B5A3750E /* Foundations.framework in Frameworks */, + 780CFC5E382460615CAE94C6 /* LogMacro.framework in Frameworks */, + 65776F13CF7279661AC15BFA /* Moya.framework in Frameworks */, + 5815C9DB81013175544F3E98 /* NetworkService.framework in Frameworks */, + AFC1224ABA81A9E751060561 /* Networking.framework in Frameworks */, + 2D36AB06BE7532A15EB82D13 /* RxMoya.framework in Frameworks */, + 8F5AF3D1F2D6B9705BF609F8 /* RxSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 38169642E05B36E0AEF61F24 /* Derived */ = { + 148D6A39ABC2587E4D2F1988 /* Derived */ = { isa = PBXGroup; children = ( - 7683298B0B11468C8351D5CF /* InfoPlists */, + EC532597712A1FBA04CFD78C /* InfoPlists */, ); path = Derived; sourceTree = ""; }; - 57FF25C92193FDC6FC2E9956 /* Sources */ = { + 38525DA2689C825D960A837C /* Sources */ = { isa = PBXGroup; children = ( - 2CB4FEF4703DFB8A526662E0 /* MusicSearchService.swift */, + 61C86AF17AA8DE62F577F55C /* MusicSearchService.swift */, ); path = Sources; sourceTree = ""; }; - 6EF9FDD21B7717FD4262395A /* Products */ = { + 6D61C1E9CBF89851A6C6512A /* Frameworks */ = { isa = PBXGroup; children = ( - 829B01728ED34A27080BAED0 /* Alamofire_Alamofire.bundle */, - F25124380C7599FF946C2474 /* Alamofire.framework */, - 6540F18A92242DF633B90D64 /* API.framework */, - 31DFD964165DEDB3D59A47AD /* AsyncMoya.framework */, - 4252AD026DC875E998C68C29 /* CombineMoya.framework */, - A02CA37CD5135A269A3E8B4C /* EventLimiter.framework */, - 3E5F4A58F852E3E9AB2C612B /* Foundations.framework */, - 27118BD665B186D6882DF66A /* LogMacro.framework */, - CB5D0A50675F4214269A1E8C /* Moya.framework */, - A05329346434BB988BB12F74 /* Networking.framework */, - 5D14E81046E0EDA166110285 /* RxMoya.framework */, - E21A286E6E06F7B25DE62E94 /* RxSwift.framework */, - 49AE8778D00783FC72E9C397 /* Service_Debug.framework */, - 656243C0336CD9A5FB069256 /* Service_Prod.framework */, - B432785FB9ED34C4A18C0C4C /* Service_Stage.framework */, - 7EDFE229DFD7957E8AC64F6F /* Service.framework */, - 259ABF995B5D27470E829C10 /* ServiceTests.xctest */, + D8C1F00AFF12186DA88082E3 /* CFNetwork.framework */, + 410749FD17EF1E79098807D7 /* OSLog.framework */, ); - name = Products; + name = Frameworks; sourceTree = ""; }; - 7683298B0B11468C8351D5CF /* InfoPlists */ = { + 79BFAA4A8F501ACDA19F72A2 /* NetworkServiceTests */ = { isa = PBXGroup; children = ( - 74A1B62620FE2F19FABD7BF1 /* Service-Debug-Info.plist */, - 79814A227CE0F11AA0C03131 /* Service-Info.plist */, - 00FFF298924B1BF14FBF4331 /* Service-Prod-Info.plist */, - D066B46F236811258B579745 /* Service-Stage-Info.plist */, - 34D19142035B122118FB9153 /* ServiceTests-Info.plist */, + 95F0EA3983CC014ECEA8C7C3 /* Sources */, ); - path = InfoPlists; + path = NetworkServiceTests; sourceTree = ""; }; - 77697C0CADA34648DBF804D8 /* Sources */ = { + 917E375D5D1EBF640B969937 = { isa = PBXGroup; children = ( - BA233B5E4422F71B1E2790B8 /* Test.swift */, + F5A12338C6DFF9DA9F364B5E /* Project */, + 96053B0DA2B8564E92B2FA2B /* Products */, + 6D61C1E9CBF89851A6C6512A /* Frameworks */, ); - path = Sources; sourceTree = ""; }; - 7D2A1FAC224A4161D0DD025B /* Project */ = { + 95F0EA3983CC014ECEA8C7C3 /* Sources */ = { isa = PBXGroup; children = ( - 38169642E05B36E0AEF61F24 /* Derived */, - 97CFFBEEA2425324063A8623 /* ServiceTests */, - 57FF25C92193FDC6FC2E9956 /* Sources */, + FF902E302B94F1E25D072003 /* Test.swift */, ); - name = Project; + path = Sources; sourceTree = ""; }; - 951DAE26418A9AE539BF6194 /* Frameworks */ = { + 96053B0DA2B8564E92B2FA2B /* Products */ = { isa = PBXGroup; children = ( - EC1B5EDC0770CED17685915E /* CFNetwork.framework */, - 8EBD9486798A0D863BB013E5 /* OSLog.framework */, + 44122DC4B6F556140219BA7D /* Alamofire_Alamofire.bundle */, + E89F30252915F82C20E583E6 /* Alamofire.framework */, + A4783C5C51D565D8F1735054 /* API.framework */, + D4241B2F482B5AE34627909C /* AsyncMoya.framework */, + F9896C9A0EC78FD9461730D0 /* CombineMoya.framework */, + 73A19A2C6007C206E0EFE3BA /* EventLimiter.framework */, + 7AA9EE93E288D43FFC77A8FC /* Foundations.framework */, + 403A6EA2F4546033A843F13D /* LogMacro.framework */, + 373E04407C0147EA95C44A93 /* Moya.framework */, + 51954E9BB4C2900ADA1E155A /* Networking.framework */, + AB54C057D5062D9B7A0C22FB /* NetworkService_Debug.framework */, + D641E594C539D5B19596E9A1 /* NetworkService_Prod.framework */, + 02BA9A9ACC792930C2249570 /* NetworkService_Stage.framework */, + ADC9183B12D666BFB5351F52 /* NetworkService.framework */, + 8F5526A4FFA664BE907263C9 /* NetworkServiceTests.xctest */, + 32C0B2F077329E24DE679921 /* RxMoya.framework */, + 27A6E7AF7B9AC6FAE949AB9D /* RxSwift.framework */, ); - name = Frameworks; + name = Products; sourceTree = ""; }; - 97CFFBEEA2425324063A8623 /* ServiceTests */ = { + EC532597712A1FBA04CFD78C /* InfoPlists */ = { isa = PBXGroup; children = ( - 77697C0CADA34648DBF804D8 /* Sources */, + 497909CEF58B222EE966AD45 /* NetworkService-Debug-Info.plist */, + C463F8FAE8AE26DF76BDB73C /* NetworkService-Info.plist */, + B1310DBB206F80EC21166002 /* NetworkService-Prod-Info.plist */, + F146C68FE886FBBF938BE28A /* NetworkService-Stage-Info.plist */, + 64DF117A648F822D059C86FC /* NetworkServiceTests-Info.plist */, ); - path = ServiceTests; + path = InfoPlists; sourceTree = ""; }; - D07C34F9592EC2D78588BE04 = { + F5A12338C6DFF9DA9F364B5E /* Project */ = { isa = PBXGroup; children = ( - 7D2A1FAC224A4161D0DD025B /* Project */, - 6EF9FDD21B7717FD4262395A /* Products */, - 951DAE26418A9AE539BF6194 /* Frameworks */, + 148D6A39ABC2587E4D2F1988 /* Derived */, + 79BFAA4A8F501ACDA19F72A2 /* NetworkServiceTests */, + 38525DA2689C825D960A837C /* Sources */, ); + name = Project; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 4D77B3747602ABAB4CDEEAE5 /* Service-Debug */ = { + 40077CE6F54050EBCAC85F36 /* NetworkService-Prod */ = { isa = PBXNativeTarget; - buildConfigurationList = 4AE20AEBB3804FE2DFF45499 /* Build configuration list for PBXNativeTarget "Service-Debug" */; + buildConfigurationList = 0AF94BACB3EC7F03BFEB8FBC /* Build configuration list for PBXNativeTarget "NetworkService-Prod" */; buildPhases = ( - 4AD85F700EA608274BF8E71E /* Sources */, - A2AA66D5428A52814A8CF2E2 /* Resources */, - 4E5B44339E15D9D7286508BD /* Frameworks */, - 5A4B9E41609D6261A34EF004 /* Embed Frameworks */, - 43672DB00161FEA57F65B408 /* Dependencies */, + 912BFDF26D7FF207A6CF7799 /* Sources */, + D2FDA50BE9E614C0AECB3C77 /* Resources */, + 15D2458E3FC3494C8CDA33E8 /* Frameworks */, + 0A3989CDACDDC1DD1E36CF4E /* Embed Frameworks */, + B012FE4FB60FF95D41D43EA6 /* Dependencies */, ); buildRules = ( ); dependencies = ( ); - name = "Service-Debug"; + name = "NetworkService-Prod"; packageProductDependencies = ( ); - productName = Service_Debug; - productReference = 49AE8778D00783FC72E9C397 /* Service_Debug.framework */; + productName = NetworkService_Prod; + productReference = D641E594C539D5B19596E9A1 /* NetworkService_Prod.framework */; productType = "com.apple.product-type.framework"; }; - 4F05B98A978D0CCF22F7E153 /* Service-Prod */ = { + 453323209A3FFF1E78EECE5D /* NetworkService */ = { isa = PBXNativeTarget; - buildConfigurationList = 7B5FE70ED73C9186D9C86451 /* Build configuration list for PBXNativeTarget "Service-Prod" */; + buildConfigurationList = 3EEC6483F5DC67DFF271B8A1 /* Build configuration list for PBXNativeTarget "NetworkService" */; buildPhases = ( - 262CDC2DFB2F08CAA66E8074 /* Sources */, - 220D40C297E32C07E0E4144B /* Resources */, - B9E255F78ED125E38CFE6433 /* Frameworks */, - 7916ECC01EDD8BCB71C5F2CE /* Embed Frameworks */, - 7B31AB9DAB84DF68E142679F /* Dependencies */, + FEB15D530FBB3AEF18ECBFDF /* Sources */, + 50C5AA2EE349E6D8938ACB46 /* Resources */, + 25FE99C35CE0963B40554522 /* Frameworks */, + A4317292F5A1DE2135F74C6F /* Embed Frameworks */, + 6D2C95A7B7A1D464C4D73C4D /* Dependencies */, ); buildRules = ( ); dependencies = ( ); - name = "Service-Prod"; + name = NetworkService; packageProductDependencies = ( ); - productName = Service_Prod; - productReference = 656243C0336CD9A5FB069256 /* Service_Prod.framework */; + productName = NetworkService; + productReference = ADC9183B12D666BFB5351F52 /* NetworkService.framework */; productType = "com.apple.product-type.framework"; }; - BC16F4EC08A28EAA48363D3F /* ServiceTests */ = { + 760D6B032E47E616DDA4CC10 /* NetworkService-Stage */ = { isa = PBXNativeTarget; - buildConfigurationList = 2061AE01CD20C06F343CE3DE /* Build configuration list for PBXNativeTarget "ServiceTests" */; + buildConfigurationList = E7FC5C52E07FB389F0968986 /* Build configuration list for PBXNativeTarget "NetworkService-Stage" */; buildPhases = ( - FEFA0B3C65A0E88A4F11A9F4 /* Sources */, - DBB59024C51A6B1A99F072A5 /* Resources */, - ED4007158FAD7C7CFF0D3491 /* Frameworks */, - E135B70B4BAD281F11E29459 /* Embed Frameworks */, - 2E2613D1F1E4C4DEE2BD94FF /* Dependencies */, + 836F87857792B278D778A66A /* Sources */, + AB7E22D159880326BA00C20E /* Resources */, + 8C85EE6DC8E2BCD3916C1911 /* Frameworks */, + 5C9B28B66514B447E40AF6A9 /* Embed Frameworks */, + B1F1DBD91319E398A8C906EE /* Dependencies */, ); buildRules = ( ); dependencies = ( - E9B114F085A8E58F492A2524 /* PBXTargetDependency */, ); - name = ServiceTests; + name = "NetworkService-Stage"; packageProductDependencies = ( ); - productName = ServiceTests; - productReference = 259ABF995B5D27470E829C10 /* ServiceTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; + productName = NetworkService_Stage; + productReference = 02BA9A9ACC792930C2249570 /* NetworkService_Stage.framework */; + productType = "com.apple.product-type.framework"; }; - D6E0EDD309910261BA164618 /* Service-Stage */ = { + C395E80BFAC0521EAB3AADA4 /* NetworkService-Debug */ = { isa = PBXNativeTarget; - buildConfigurationList = 8A672D2435F864E61BC030CD /* Build configuration list for PBXNativeTarget "Service-Stage" */; + buildConfigurationList = A1CB7678E45587F5EC13BACD /* Build configuration list for PBXNativeTarget "NetworkService-Debug" */; buildPhases = ( - 68FD6384534887A583C925B2 /* Sources */, - 099BBED0A3D302533934CC25 /* Resources */, - 34B55B2B9613E5178446EFC1 /* Frameworks */, - 11D2D814492A2F170FB62D24 /* Embed Frameworks */, - E9A743867ABF14264AA4F46D /* Dependencies */, + EB2D98F3BD1A344AF11CB338 /* Sources */, + 0BE0FBC4295A9AC7F72137EF /* Resources */, + BEFEF37BF6E8106043D3C0BD /* Frameworks */, + 8343B143D49F41584DF9676A /* Embed Frameworks */, + 6BB2625AEFA4E1B157C46F4E /* Dependencies */, ); buildRules = ( ); dependencies = ( ); - name = "Service-Stage"; + name = "NetworkService-Debug"; packageProductDependencies = ( ); - productName = Service_Stage; - productReference = B432785FB9ED34C4A18C0C4C /* Service_Stage.framework */; + productName = NetworkService_Debug; + productReference = AB54C057D5062D9B7A0C22FB /* NetworkService_Debug.framework */; productType = "com.apple.product-type.framework"; }; - F2B641F230465A1CF012FDED /* Service */ = { + E9352438CCA76AF037B25979 /* NetworkServiceTests */ = { isa = PBXNativeTarget; - buildConfigurationList = AAD510D6A096645A1B961388 /* Build configuration list for PBXNativeTarget "Service" */; + buildConfigurationList = 433131CA5F360E47E61E12C3 /* Build configuration list for PBXNativeTarget "NetworkServiceTests" */; buildPhases = ( - 90DCD84B70AC87F1B09042E8 /* Sources */, - 5DB916BB3D046F2698257E14 /* Resources */, - E46B5D6AB1628CA99D638546 /* Frameworks */, - 5B36A939A245B5A27F657AD1 /* Embed Frameworks */, - D2E9552C3D1506E8E42EB8ED /* Dependencies */, + FD53998A6167CC4256715864 /* Sources */, + 8D8781B4CB71C1D45E518232 /* Resources */, + FD0B822481C7DFC72D8E42F0 /* Frameworks */, + F4165CBA29B202002CFAD1D1 /* Embed Frameworks */, + BD42D38CED5A1430CEAF5321 /* Dependencies */, ); buildRules = ( ); dependencies = ( + C0C0FEEF7495AEC5CFDF5830 /* PBXTargetDependency */, ); - name = Service; + name = NetworkServiceTests; packageProductDependencies = ( ); - productName = Service; - productReference = 7EDFE229DFD7957E8AC64F6F /* Service.framework */; - productType = "com.apple.product-type.framework"; + productName = NetworkServiceTests; + productReference = 8F5526A4FFA664BE907263C9 /* NetworkServiceTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2387D8980C051CCC13E9F55A /* Project object */ = { + EB3FED4C698FF2A4ADFEA857 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; TargetAttributes = { }; }; - buildConfigurationList = A210B9CE0F80C75DCB439AE9 /* Build configuration list for PBXProject "Service" */; + buildConfigurationList = FFC6118989876A9280B17F0F /* Build configuration list for PBXProject "NetworkService" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = ko; hasScannedForEncodings = 0; @@ -468,113 +468,113 @@ en, ko, ); - mainGroup = D07C34F9592EC2D78588BE04; - productRefGroup = 6EF9FDD21B7717FD4262395A /* Products */; + mainGroup = 917E375D5D1EBF640B969937; + productRefGroup = 96053B0DA2B8564E92B2FA2B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - F2B641F230465A1CF012FDED /* Service */, - 4D77B3747602ABAB4CDEEAE5 /* Service-Debug */, - 4F05B98A978D0CCF22F7E153 /* Service-Prod */, - D6E0EDD309910261BA164618 /* Service-Stage */, - BC16F4EC08A28EAA48363D3F /* ServiceTests */, + 453323209A3FFF1E78EECE5D /* NetworkService */, + C395E80BFAC0521EAB3AADA4 /* NetworkService-Debug */, + 40077CE6F54050EBCAC85F36 /* NetworkService-Prod */, + 760D6B032E47E616DDA4CC10 /* NetworkService-Stage */, + E9352438CCA76AF037B25979 /* NetworkServiceTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 099BBED0A3D302533934CC25 /* Resources */ = { + 0BE0FBC4295A9AC7F72137EF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 220D40C297E32C07E0E4144B /* Resources */ = { + 50C5AA2EE349E6D8938ACB46 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 5DB916BB3D046F2698257E14 /* Resources */ = { + 8D8781B4CB71C1D45E518232 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 256613891D079023B15E9346 /* Alamofire_Alamofire.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A2AA66D5428A52814A8CF2E2 /* Resources */ = { + AB7E22D159880326BA00C20E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - DBB59024C51A6B1A99F072A5 /* Resources */ = { + D2FDA50BE9E614C0AECB3C77 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 94692EDF2CEFD2E8ABCB552C /* Alamofire_Alamofire.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 262CDC2DFB2F08CAA66E8074 /* Sources */ = { + 836F87857792B278D778A66A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 843C6AEBBD6B72FD0CD8CA69 /* MusicSearchService.swift in Sources */, + CAA8A251419C0E1F319BF4C8 /* MusicSearchService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4AD85F700EA608274BF8E71E /* Sources */ = { + 912BFDF26D7FF207A6CF7799 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - FBD23A1822182F559DFBDC36 /* MusicSearchService.swift in Sources */, + 425B500FCFEBF113AC95343E /* MusicSearchService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 68FD6384534887A583C925B2 /* Sources */ = { + EB2D98F3BD1A344AF11CB338 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3E3708439743A2C547ED2492 /* MusicSearchService.swift in Sources */, + 4237FD4C49A37B11C3F9DCE9 /* MusicSearchService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 90DCD84B70AC87F1B09042E8 /* Sources */ = { + FD53998A6167CC4256715864 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 889DD39EC5C731443684AAF0 /* MusicSearchService.swift in Sources */, + 73919BE18D79ACF07833CDE2 /* Test.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FEFA0B3C65A0E88A4F11A9F4 /* Sources */ = { + FEB15D530FBB3AEF18ECBFDF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8279A0344BCCCB23F8D07ADA /* Test.swift in Sources */, + 94EE234257B5E19EB58A2F3A /* MusicSearchService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - E9B114F085A8E58F492A2524 /* PBXTargetDependency */ = { + C0C0FEEF7495AEC5CFDF5830 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Service; - target = F2B641F230465A1CF012FDED /* Service */; - targetProxy = E6E9DF8F0EEA2CFC49A3B0CB /* PBXContainerItemProxy */; + name = NetworkService; + target = 453323209A3FFF1E78EECE5D /* NetworkService */; + targetProxy = 77BA0D117672E7DC1BE27729 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 078F713D85496981E09AF488 /* Release */ = { + 195AB1F974EE3F8DC02EDB07 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -587,7 +587,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Prod-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Debug-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -607,8 +607,8 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Prod; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Debug; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -623,7 +623,7 @@ }; name = Release; }; - 0CF2F251CC7ACBFD83CB03BA /* Release */ = { + 421DE9A2A02E61D79A03602A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -636,7 +636,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -656,8 +656,8 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -672,7 +672,7 @@ }; name = Release; }; - 19C867CD46A97143B756714A /* Debug */ = { + 45B806902835BDAAA647D2FF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -685,7 +685,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Stage-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Stage-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -705,41 +705,44 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Stage; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Stage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( - "$(inherited)", - DEBUG, - ); - SWIFT_COMPILATION_MODE = singlefile; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 1DD718A4523A14F31838AD9A /* Release */ = { + 5E7B9EC29A8B3DFD9961DD7C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/ServiceTests-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; OTHER_CFLAGS = ( "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", @@ -751,20 +754,27 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service.ServiceTests; - PRODUCT_NAME = ServiceTests; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService; SDKROOT = iphoneos; + SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 527A8504FEC0D977F10DFE1D /* Debug */ = { + 6857862F3B606B0A883BBB89 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -800,30 +810,24 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; + MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = Release; }; - 827688E819193446D6A86496 /* Debug */ = { + 6E46BC34D1714207EF8C48EC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -836,7 +840,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Stage-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -856,8 +860,8 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Stage; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -876,28 +880,21 @@ }; name = Debug; }; - 9B46EB756EEFE59D86CA13FC /* Release */ = { + 905A7408FBB289B388986350 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; + CODE_SIGN_IDENTITY = "iPhone Developer"; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Stage-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkServiceTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; OTHER_CFLAGS = ( "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", @@ -909,10 +906,9 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Stage; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService.NetworkServiceTests; + PRODUCT_NAME = NetworkServiceTests; SDKROOT = iphoneos; - SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -920,12 +916,10 @@ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; name = Release; }; - B329BCF86CB8AB9EF8BAD557 /* Debug */ = { + 9FA5892A7D2E8A3E7E733A86 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -938,7 +932,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Prod-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Prod-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -958,27 +952,23 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Prod; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Prod; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( - "$(inherited)", - DEBUG, - ); - SWIFT_COMPILATION_MODE = singlefile; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - BAF2CCBF694046F2B33FBFE7 /* Debug */ = { + A0223834E1A0FD284D41D11D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_IDENTITY = ""; @@ -991,7 +981,7 @@ "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Debug-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Debug-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -1011,8 +1001,8 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Debug; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Debug; SDKROOT = iphoneos; SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; @@ -1031,21 +1021,28 @@ }; name = Debug; }; - CCD6AD99FB506BBD3797799B /* Debug */ = { + BB8491C679AF129B676D20FE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/ServiceTests-Info.plist"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkService-Prod-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACH_O_TYPE = staticlib; OTHER_CFLAGS = ( "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", @@ -1057,9 +1054,10 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service.ServiceTests; - PRODUCT_NAME = ServiceTests; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService; + PRODUCT_NAME = NetworkService_Prod; SDKROOT = iphoneos; + SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -1071,10 +1069,12 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - D3499E0DC93D0169932DD5F0 /* Release */ = { + CEC7329D98018C021E2E5B1F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1110,45 +1110,44 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; - VALIDATE_PRODUCT = YES; }; - name = Release; + name = Debug; }; - FEDF02C8CAF40325944856B9 /* Release */ = { + F388090BBECCE4AAC04E1219 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; + CODE_SIGN_IDENTITY = "iPhone Developer"; HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", ); - INFOPLIST_FILE = "Derived/InfoPlists/Service-Debug-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "Derived/InfoPlists/NetworkServiceTests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; OTHER_CFLAGS = ( "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", @@ -1160,80 +1159,81 @@ "-load-plugin-executable", "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", ); - PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Service; - PRODUCT_NAME = Service_Debug; + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.NetworkService.NetworkServiceTests; + PRODUCT_NAME = NetworkServiceTests; SDKROOT = iphoneos; - SKIP_INSTALL = YES; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2061AE01CD20C06F343CE3DE /* Build configuration list for PBXNativeTarget "ServiceTests" */ = { + 0AF94BACB3EC7F03BFEB8FBC /* Build configuration list for PBXNativeTarget "NetworkService-Prod" */ = { isa = XCConfigurationList; buildConfigurations = ( - CCD6AD99FB506BBD3797799B /* Debug */, - 1DD718A4523A14F31838AD9A /* Release */, + BB8491C679AF129B676D20FE /* Debug */, + 9FA5892A7D2E8A3E7E733A86 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4AE20AEBB3804FE2DFF45499 /* Build configuration list for PBXNativeTarget "Service-Debug" */ = { + 3EEC6483F5DC67DFF271B8A1 /* Build configuration list for PBXNativeTarget "NetworkService" */ = { isa = XCConfigurationList; buildConfigurations = ( - BAF2CCBF694046F2B33FBFE7 /* Debug */, - FEDF02C8CAF40325944856B9 /* Release */, + 5E7B9EC29A8B3DFD9961DD7C /* Debug */, + 421DE9A2A02E61D79A03602A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7B5FE70ED73C9186D9C86451 /* Build configuration list for PBXNativeTarget "Service-Prod" */ = { + 433131CA5F360E47E61E12C3 /* Build configuration list for PBXNativeTarget "NetworkServiceTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - B329BCF86CB8AB9EF8BAD557 /* Debug */, - 078F713D85496981E09AF488 /* Release */, + F388090BBECCE4AAC04E1219 /* Debug */, + 905A7408FBB289B388986350 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8A672D2435F864E61BC030CD /* Build configuration list for PBXNativeTarget "Service-Stage" */ = { + A1CB7678E45587F5EC13BACD /* Build configuration list for PBXNativeTarget "NetworkService-Debug" */ = { isa = XCConfigurationList; buildConfigurations = ( - 19C867CD46A97143B756714A /* Debug */, - 9B46EB756EEFE59D86CA13FC /* Release */, + A0223834E1A0FD284D41D11D /* Debug */, + 195AB1F974EE3F8DC02EDB07 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A210B9CE0F80C75DCB439AE9 /* Build configuration list for PBXProject "Service" */ = { + E7FC5C52E07FB389F0968986 /* Build configuration list for PBXNativeTarget "NetworkService-Stage" */ = { isa = XCConfigurationList; buildConfigurations = ( - 527A8504FEC0D977F10DFE1D /* Debug */, - D3499E0DC93D0169932DD5F0 /* Release */, + 6E46BC34D1714207EF8C48EC /* Debug */, + 45B806902835BDAAA647D2FF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AAD510D6A096645A1B961388 /* Build configuration list for PBXNativeTarget "Service" */ = { + FFC6118989876A9280B17F0F /* Build configuration list for PBXProject "NetworkService" */ = { isa = XCConfigurationList; buildConfigurations = ( - 827688E819193446D6A86496 /* Debug */, - 0CF2F251CC7ACBFD83CB03BA /* Release */, + CEC7329D98018C021E2E5B1F /* Debug */, + 6857862F3B606B0A883BBB89 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 2387D8980C051CCC13E9F55A /* Project object */; + rootObject = EB3FED4C698FF2A4ADFEA857 /* Project object */; } diff --git a/Projects/Core/Data/Service/Service.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Projects/Core/Data/Service/Service.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Projects/Core/Data/NetworkService/NetworkService.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Debug.xcscheme b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Debug.xcscheme new file mode 100644 index 0000000..449b159 --- /dev/null +++ b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Debug.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Prod.xcscheme b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Prod.xcscheme new file mode 100644 index 0000000..93a2468 --- /dev/null +++ b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Prod.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Stage.xcscheme b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Stage.xcscheme new file mode 100644 index 0000000..e40932f --- /dev/null +++ b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService-Stage.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService.xcscheme b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService.xcscheme new file mode 100644 index 0000000..aa8d7d6 --- /dev/null +++ b/Projects/Core/Data/NetworkService/NetworkService.xcodeproj/xcshareddata/xcschemes/NetworkService.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Core/Data/Service/ServiceTests/Sources/Test.swift b/Projects/Core/Data/NetworkService/NetworkServiceTests/Sources/Test.swift similarity index 100% rename from Projects/Core/Data/Service/ServiceTests/Sources/Test.swift rename to Projects/Core/Data/NetworkService/NetworkServiceTests/Sources/Test.swift diff --git a/Projects/Core/Data/Service/Project.swift b/Projects/Core/Data/NetworkService/Project.swift similarity index 82% rename from Projects/Core/Data/Service/Project.swift rename to Projects/Core/Data/NetworkService/Project.swift index bbbee98..32b79d7 100644 --- a/Projects/Core/Data/Service/Project.swift +++ b/Projects/Core/Data/NetworkService/Project.swift @@ -5,8 +5,8 @@ import ProjectTemplatePlugin import DependencyPackagePlugin let project = Project.makeAppModule( - name: "Service", - bundleId: .appBundleID(name: ".Service"), + name: "NetworkService", + bundleId: .appBundleID(name: ".NetworkService"), product: .staticFramework, settings: .settings(), dependencies: [ diff --git a/Projects/Core/Data/Service/Sources/MusicSearchService.swift b/Projects/Core/Data/NetworkService/Sources/MusicSearchService.swift similarity index 84% rename from Projects/Core/Data/Service/Sources/MusicSearchService.swift rename to Projects/Core/Data/NetworkService/Sources/MusicSearchService.swift index 7aee044..b1c19e1 100644 --- a/Projects/Core/Data/Service/Sources/MusicSearchService.swift +++ b/Projects/Core/Data/NetworkService/Sources/MusicSearchService.swift @@ -11,7 +11,7 @@ import API import Moya public enum MusicSearchService { - case searchMusic(query: String) + case searchMusic(query: String, media: String, entity: String) case detailMusic(id: String) } @@ -23,7 +23,7 @@ extension MusicSearchService: BaseTargetType { switch self { case .searchMusic: return .searchMusic - case .detailMusic(let id): + case .detailMusic: return .searchDetailMusic } } @@ -44,12 +44,16 @@ extension MusicSearchService: BaseTargetType { public var parameters: [String : Any]? { switch self { - case .searchMusic(let query): + case .searchMusic( + let query, + let media, + let entity + ): let parameters: [String: Any] = [ "term": query, "country": "KR", - "media": "music", - "entity": "song" + "media": media, + "entity": entity ] return parameters diff --git a/Projects/Core/Data/Repository/Project.swift b/Projects/Core/Data/Repository/Project.swift index aa16a2c..fcc742d 100644 --- a/Projects/Core/Data/Repository/Project.swift +++ b/Projects/Core/Data/Repository/Project.swift @@ -12,7 +12,7 @@ let project = Project.makeAppModule( dependencies: [ .Network(implements: .Networking), .Data(implements: .DataInterface), - .Data(implements: .Service) + .Data(implements: .NetworkService) ], sources: ["Sources/**"] ) diff --git a/Projects/Core/Data/Repository/Repository.xcodeproj/project.pbxproj b/Projects/Core/Data/Repository/Repository.xcodeproj/project.pbxproj index 9d78560..d1a0f1f 100644 --- a/Projects/Core/Data/Repository/Repository.xcodeproj/project.pbxproj +++ b/Projects/Core/Data/Repository/Repository.xcodeproj/project.pbxproj @@ -3,56 +3,56 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ 065CDD9E3F159CCEC6E1A6C0 /* Repository.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03D39D8FFA6B36EC82B3C778 /* Repository.framework */; }; 08A491E1067C93EFC4474817 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1CC14A70BD175D51D4A7EEB /* Moya.framework */; }; 0E8E0386D1DD34B39FB8C982 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC8B445ECB8E6566CF649974 /* API.framework */; }; + 0F7FC24EE51D65F16F679DD9 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */; }; + 1493A92373C84B151369E627 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */; }; 233EAF0D96C6FF11DCB925F5 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E9256A28824CD986ECC1EF08 /* Networking.framework */; }; 2346B53A47FF5D90E70215B7 /* DataInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 0C051AEF60DC4BF2E9179E04 /* DataInterface.framework */; }; 29734DE54DCB5E7218BF8203 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFD6BEF4EEDC73B527495BB6 /* RxSwift.framework */; }; - 2C23766DA5EC5A267DB2DE38 /* Service.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 549C82A8C41E9EBA4FDC62C7 /* Service.framework */; }; + 2B947979ACB693C05AD6B015 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */; }; + 2DF6D059B5BEA6E0B238E39A /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2241AFC7440EECBBEA5F080 /* NetworkService.framework */; }; 41FC709A51F996C647FD9DFC /* DataInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 0C051AEF60DC4BF2E9179E04 /* DataInterface.framework */; }; - 45C48AEEAADB0663CA55BCE9 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */; }; + 46B0E414B2BDD688E504C8E0 /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */; }; 4878837B4312F041BF286CD0 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E9256A28824CD986ECC1EF08 /* Networking.framework */; }; 5FF9785CD2D8ABD53E784222 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AA1CFA625141FD7F9B1DB22 /* Alamofire.framework */; }; - 6705DA518DEFDF32D0CD39D8 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */; }; + 66D7EC80E7D8F0F121525643 /* NetworkService.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B2241AFC7440EECBBEA5F080 /* NetworkService.framework */; }; + 6C362D38646AAB6377572599 /* NetworkService.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B2241AFC7440EECBBEA5F080 /* NetworkService.framework */; }; 6F837F554EA43B635EE2C5CC /* MockMusicSearchRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FED9E1BBAF2A605DF08D38F /* MockMusicSearchRepositoryTests.swift */; }; + 70D43BE4BC6051CD47CE22C9 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */; }; + 71DDF859FE56E0D552BBCAA3 /* MockMusicDetailRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE639263A3360A13D18123F6 /* MockMusicDetailRepositoryTests.swift */; }; 7355412663C7423424F3A245 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F43CDC33501823FDC6E616D3 /* CFNetwork.framework */; }; + 755769BF04DD13ACB79CB2C7 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */; }; 7BA89C01047091FDCCB28455 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6C8A7366562A815FBE2C7810 /* Alamofire_Alamofire.bundle */; }; - 7F1AC7302EB44DE100C82441 /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */; }; - 7F1AC7312EB44DE100C82441 /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */; }; - 7F1AC7322EB44DE100C82441 /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */; }; - 7F1AC7332EB44DE100C82441 /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */; }; - 7F1AC7362EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */; }; - 7F1AC7372EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */; }; - 7F1AC7382EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */; }; - 7F1AC7392EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */; }; - 7F1AC7482EB4518E00C82441 /* MockMusicDetailRepositoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7472EB4518A00C82441 /* MockMusicDetailRepositoryTests.swift */; }; - 81C2AF9977596554B4F5A0F2 /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */; }; + 852E363B64C96BBAE2951912 /* MockMusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */; }; 8A4EA2436DC81B20486209C6 /* DataInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C051AEF60DC4BF2E9179E04 /* DataInterface.framework */; }; 8D3EE4A12A835297EA66F043 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B001E4EB12F1B31552843EC8 /* Model.framework */; }; - 8E479DDB904E8ABBD71E8302 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */; }; + 984F4B7AC3C7C2104F98C5FE /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */; }; A2333F1CDF2EE173146917D2 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 6C8A7366562A815FBE2C7810 /* Alamofire_Alamofire.bundle */; }; A698F595B604CF8C68EA6FF2 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E9256A28824CD986ECC1EF08 /* Networking.framework */; }; - A6F8318AFCC8184F57011D50 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */; }; + B2C509483A0241F46C73DE3B /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */; }; B4CC4F2D8A5386E268661131 /* DataInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 0C051AEF60DC4BF2E9179E04 /* DataInterface.framework */; }; + BB6941E719F034681417B60F /* NetworkService.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B2241AFC7440EECBBEA5F080 /* NetworkService.framework */; }; + BB87E1D5CABCE54FB184CEBD /* MusicDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */; }; BC3E81878EF9E2A2651B2F87 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6CD10CD4A587CB9F328BD12 /* LogMacro.framework */; }; - C1271844DE5B9D13E9E7CBC0 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 549C82A8C41E9EBA4FDC62C7 /* Service.framework */; }; + C0BEB24AF27B909091655C5F /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */; }; C1669AB5BB04B11E566D8683 /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19A290AEAD111F015CBFDADB /* AsyncMoya.framework */; }; CA96831896F9A6B6811C6C3E /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 39FAE0770B930CBF414B8F54 /* EventLimiter.framework */; }; - CD59907F5FF407743514DB95 /* Service.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 549C82A8C41E9EBA4FDC62C7 /* Service.framework */; }; + CC8F08BF0C4A0BA10A5D29C0 /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */; }; + CF31E5E654224F48DE60CFEC /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */; }; DA272BEA4FC48206CDC3E121 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C30B633FFEC1DE967352E8 /* RxMoya.framework */; }; - DB3850164E364C8631CF1E02 /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */; }; - DCD884BEF59149765121ADBC /* Service.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 549C82A8C41E9EBA4FDC62C7 /* Service.framework */; }; DEEC771D534965D1D392318A /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B285930F3594266FEB0BC20 /* Foundations.framework */; }; - DFE6A1AEA515B11BA230F73B /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */; }; - E3B07C5281726FE5EFA47795 /* Service.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 549C82A8C41E9EBA4FDC62C7 /* Service.framework */; }; + E495B59E5AA0112995A9FC22 /* MusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */; }; + E9AFD9DED60E9988784B5B69 /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */; }; EAA7EA5BDD8E847A1A0A5854 /* Networking.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E9256A28824CD986ECC1EF08 /* Networking.framework */; }; ED7ABEC4AB9FBA1707BB2752 /* DataInterface.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 0C051AEF60DC4BF2E9179E04 /* DataInterface.framework */; }; - F8B52702933627F2493EF0EB /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */; }; + EF7ACB950D19290202504C73 /* MockMusicSearchRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */; }; + F5448EA7F201F762686A261E /* NetworkService.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B2241AFC7440EECBBEA5F080 /* NetworkService.framework */; }; FD0FCD7CCB8F7E01AA5683F1 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2B6D597B16E9CDDB21DA680 /* OSLog.framework */; }; FEFB0DA0A60E3FBF3A1B1416 /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9256A28824CD986ECC1EF08 /* Networking.framework */; }; FFDACF7E5B91FBAE76D131B1 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A402D4C6F1E028A1FF6A15B9 /* CombineMoya.framework */; }; @@ -105,8 +105,8 @@ dstSubfolderSpec = 16; files = ( B4CC4F2D8A5386E268661131 /* DataInterface.framework in Dependencies */, + 6C362D38646AAB6377572599 /* NetworkService.framework in Dependencies */, 233EAF0D96C6FF11DCB925F5 /* Networking.framework in Dependencies */, - 2C23766DA5EC5A267DB2DE38 /* Service.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -147,8 +147,8 @@ dstSubfolderSpec = 16; files = ( ED7ABEC4AB9FBA1707BB2752 /* DataInterface.framework in Dependencies */, + F5448EA7F201F762686A261E /* NetworkService.framework in Dependencies */, EAA7EA5BDD8E847A1A0A5854 /* Networking.framework in Dependencies */, - DCD884BEF59149765121ADBC /* Service.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -159,8 +159,8 @@ dstSubfolderSpec = 16; files = ( 41FC709A51F996C647FD9DFC /* DataInterface.framework in Dependencies */, + 66D7EC80E7D8F0F121525643 /* NetworkService.framework in Dependencies */, 4878837B4312F041BF286CD0 /* Networking.framework in Dependencies */, - CD59907F5FF407743514DB95 /* Service.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -171,8 +171,8 @@ dstSubfolderSpec = 16; files = ( 2346B53A47FF5D90E70215B7 /* DataInterface.framework in Dependencies */, + BB6941E719F034681417B60F /* NetworkService.framework in Dependencies */, A698F595B604CF8C68EA6FF2 /* Networking.framework in Dependencies */, - E3B07C5281726FE5EFA47795 /* Service.framework in Dependencies */, ); name = Dependencies; runOnlyForDeploymentPostprocessing = 1; @@ -188,31 +188,31 @@ 19A290AEAD111F015CBFDADB /* AsyncMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1B285930F3594266FEB0BC20 /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34E66E9088F97B1F320BF8B4 /* Repository_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Repository_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailRepository.swift; sourceTree = ""; }; 39FAE0770B930CBF414B8F54 /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicSearchRepository.swift; sourceTree = ""; }; 4131E6C825DB8588F94C2088 /* Repository_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Repository_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4AA1CFA625141FD7F9B1DB22 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 549C82A8C41E9EBA4FDC62C7 /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicSearchRepository.swift; sourceTree = ""; }; - 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchRepository.swift; sourceTree = ""; }; 67D7E950058188008115D32D /* Repository_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Repository_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6C8A7366562A815FBE2C7810 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchRepository.swift; sourceTree = ""; }; 7DB3288BD804BE671D5A9E6C /* RepositoryTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RepositoryTests-Info.plist"; sourceTree = ""; }; - 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailRepository.swift; sourceTree = ""; }; - 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicDetailRepository.swift; sourceTree = ""; }; - 7F1AC7472EB4518A00C82441 /* MockMusicDetailRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicDetailRepositoryTests.swift; sourceTree = ""; }; 7FED9E1BBAF2A605DF08D38F /* MockMusicSearchRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicSearchRepositoryTests.swift; sourceTree = ""; }; 8434724C7BDFEA2B4A08E1DC /* Repository-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Repository-Info.plist"; sourceTree = ""; }; 9EE453BD6A8A16DC688113B4 /* Repository-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Repository-Stage-Info.plist"; sourceTree = ""; }; A402D4C6F1E028A1FF6A15B9 /* CombineMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AFD6BEF4EEDC73B527495BB6 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B001E4EB12F1B31552843EC8 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B2241AFC7440EECBBEA5F080 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B6CD10CD4A587CB9F328BD12 /* LogMacro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LogMacro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BC8B445ECB8E6566CF649974 /* API.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = API.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C1CC14A70BD175D51D4A7EEB /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C2B6D597B16E9CDDB21DA680 /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OSLog.framework; sourceTree = DEVELOPER_DIR; }; + CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicDetailRepository.swift; sourceTree = ""; }; E9256A28824CD986ECC1EF08 /* Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F43CDC33501823FDC6E616D3 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; F9C30B633FFEC1DE967352E8 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FE639263A3360A13D18123F6 /* MockMusicDetailRepositoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockMusicDetailRepositoryTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -246,11 +246,11 @@ BC3E81878EF9E2A2651B2F87 /* LogMacro.framework in Frameworks */, 8D3EE4A12A835297EA66F043 /* Model.framework in Frameworks */, 08A491E1067C93EFC4474817 /* Moya.framework in Frameworks */, + 2DF6D059B5BEA6E0B238E39A /* NetworkService.framework in Frameworks */, FEFB0DA0A60E3FBF3A1B1416 /* Networking.framework in Frameworks */, 065CDD9E3F159CCEC6E1A6C0 /* Repository.framework in Frameworks */, DA272BEA4FC48206CDC3E121 /* RxMoya.framework in Frameworks */, 29734DE54DCB5E7218BF8203 /* RxSwift.framework in Frameworks */, - C1271844DE5B9D13E9E7CBC0 /* Service.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -274,7 +274,7 @@ 280ACB745E0A714E9FEB0344 /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC7472EB4518A00C82441 /* MockMusicDetailRepositoryTests.swift */, + FE639263A3360A13D18123F6 /* MockMusicDetailRepositoryTests.swift */, 7FED9E1BBAF2A605DF08D38F /* MockMusicSearchRepositoryTests.swift */, ); path = Sources; @@ -283,8 +283,8 @@ 2D734AC98FF0BE5BAB8E93F5 /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC72E2EB44DC500C82441 /* Detail */, - 7F1AC72D2EB44DB700C82441 /* Search */, + A604B1AC0250F705EF021006 /* Detail */, + 6C146823AECACF85E598936E /* Search */, ); path = Sources; sourceTree = ""; @@ -316,20 +316,20 @@ ); sourceTree = ""; }; - 7F1AC72D2EB44DB700C82441 /* Search */ = { + 6C146823AECACF85E598936E /* Search */ = { isa = PBXGroup; children = ( - 588E92682ED2660339A34860 /* MockMusicSearchRepository.swift */, - 60A1061A0F7A5DEF2B3433B7 /* MusicSearchRepository.swift */, + 3AF8BB789BCB3B6B00642080 /* MockMusicSearchRepository.swift */, + 7CC502E3FA7AF9B4519D8AA2 /* MusicSearchRepository.swift */, ); path = Search; sourceTree = ""; }; - 7F1AC72E2EB44DC500C82441 /* Detail */ = { + A604B1AC0250F705EF021006 /* Detail */ = { isa = PBXGroup; children = ( - 7F1AC7342EB44E3200C82441 /* MockMusicDetailRepository.swift */, - 7F1AC72F2EB44DD900C82441 /* MusicDetailRepository.swift */, + CDF53AC9F5AB783A89AC1BDB /* MockMusicDetailRepository.swift */, + 3909B7341924E6CE41091993 /* MusicDetailRepository.swift */, ); path = Detail; sourceTree = ""; @@ -358,6 +358,7 @@ B001E4EB12F1B31552843EC8 /* Model.framework */, C1CC14A70BD175D51D4A7EEB /* Moya.framework */, E9256A28824CD986ECC1EF08 /* Networking.framework */, + B2241AFC7440EECBBEA5F080 /* NetworkService.framework */, 67D7E950058188008115D32D /* Repository_Debug.framework */, 4131E6C825DB8588F94C2088 /* Repository_Prod.framework */, 34E66E9088F97B1F320BF8B4 /* Repository_Stage.framework */, @@ -365,7 +366,6 @@ 18618E5B5CE8E0BEE5F43988 /* RepositoryTests.xctest */, F9C30B633FFEC1DE967352E8 /* RxMoya.framework */, AFD6BEF4EEDC73B527495BB6 /* RxSwift.framework */, - 549C82A8C41E9EBA4FDC62C7 /* Service.framework */, ); name = Products; sourceTree = ""; @@ -506,6 +506,8 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; }; buildConfigurationList = DAEAABCA4F1BDA57B6C50343 /* Build configuration list for PBXProject "Repository" */; compatibilityVersion = "Xcode 14.0"; @@ -573,10 +575,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC7372EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */, - 7F1AC7302EB44DE100C82441 /* MusicDetailRepository.swift in Sources */, - DFE6A1AEA515B11BA230F73B /* MockMusicSearchRepository.swift in Sources */, - 8E479DDB904E8ABBD71E8302 /* MusicSearchRepository.swift in Sources */, + 755769BF04DD13ACB79CB2C7 /* MockMusicDetailRepository.swift in Sources */, + B2C509483A0241F46C73DE3B /* MusicDetailRepository.swift in Sources */, + C0BEB24AF27B909091655C5F /* MockMusicSearchRepository.swift in Sources */, + CF31E5E654224F48DE60CFEC /* MusicSearchRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -584,10 +586,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC7392EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */, - 7F1AC7322EB44DE100C82441 /* MusicDetailRepository.swift in Sources */, - F8B52702933627F2493EF0EB /* MockMusicSearchRepository.swift in Sources */, - 45C48AEEAADB0663CA55BCE9 /* MusicSearchRepository.swift in Sources */, + 70D43BE4BC6051CD47CE22C9 /* MockMusicDetailRepository.swift in Sources */, + BB87E1D5CABCE54FB184CEBD /* MusicDetailRepository.swift in Sources */, + EF7ACB950D19290202504C73 /* MockMusicSearchRepository.swift in Sources */, + 1493A92373C84B151369E627 /* MusicSearchRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -595,10 +597,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC7382EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */, - 7F1AC7312EB44DE100C82441 /* MusicDetailRepository.swift in Sources */, - 81C2AF9977596554B4F5A0F2 /* MockMusicSearchRepository.swift in Sources */, - 6705DA518DEFDF32D0CD39D8 /* MusicSearchRepository.swift in Sources */, + 852E363B64C96BBAE2951912 /* MockMusicDetailRepository.swift in Sources */, + 984F4B7AC3C7C2104F98C5FE /* MusicDetailRepository.swift in Sources */, + CC8F08BF0C4A0BA10A5D29C0 /* MockMusicSearchRepository.swift in Sources */, + E495B59E5AA0112995A9FC22 /* MusicSearchRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -606,10 +608,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC7362EB44ED300C82441 /* MockMusicDetailRepository.swift in Sources */, - 7F1AC7332EB44DE100C82441 /* MusicDetailRepository.swift in Sources */, - DB3850164E364C8631CF1E02 /* MockMusicSearchRepository.swift in Sources */, - A6F8318AFCC8184F57011D50 /* MusicSearchRepository.swift in Sources */, + 2B947979ACB693C05AD6B015 /* MockMusicDetailRepository.swift in Sources */, + 46B0E414B2BDD688E504C8E0 /* MusicDetailRepository.swift in Sources */, + E9AFD9DED60E9988784B5B69 /* MockMusicSearchRepository.swift in Sources */, + 0F7FC24EE51D65F16F679DD9 /* MusicSearchRepository.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -617,7 +619,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC7482EB4518E00C82441 /* MockMusicDetailRepositoryTests.swift in Sources */, + 71DDF859FE56E0D552BBCAA3 /* MockMusicDetailRepositoryTests.swift in Sources */, 6F837F554EA43B635EE2C5CC /* MockMusicSearchRepositoryTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -653,7 +655,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository.RepositoryTests; PRODUCT_NAME = RepositoryTests; SDKROOT = iphoneos; @@ -693,7 +701,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Stage; SDKROOT = iphoneos; @@ -736,7 +750,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Prod; SDKROOT = iphoneos; @@ -744,7 +764,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -780,7 +803,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Debug; SDKROOT = iphoneos; @@ -823,7 +852,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Prod; SDKROOT = iphoneos; @@ -859,14 +894,23 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository.RepositoryTests; PRODUCT_NAME = RepositoryTests; SDKROOT = iphoneos; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -900,7 +944,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository; SDKROOT = iphoneos; @@ -943,7 +993,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Debug; SDKROOT = iphoneos; @@ -951,7 +1007,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -987,7 +1046,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository_Stage; SDKROOT = iphoneos; @@ -995,7 +1060,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1143,7 +1211,13 @@ "$(inherited)", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Repository; PRODUCT_NAME = Repository; SDKROOT = iphoneos; @@ -1151,7 +1225,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Projects/Core/Data/Repository/RepositoryTests/Sources/MockMusicSearchRepositoryTests.swift b/Projects/Core/Data/Repository/RepositoryTests/Sources/MockMusicSearchRepositoryTests.swift index 399d6cd..42477c9 100644 --- a/Projects/Core/Data/Repository/RepositoryTests/Sources/MockMusicSearchRepositoryTests.swift +++ b/Projects/Core/Data/Repository/RepositoryTests/Sources/MockMusicSearchRepositoryTests.swift @@ -15,11 +15,10 @@ extension Tag { @Tag static var mock: Self @Tag static var unit: Self @Tag static var repository: Self - @Tag static var moyaStub: Self } @Suite("MusicSearchRepository Unit Tests", .tags(.unit, .mock, .repository)) -struct MockMusicSearchRepositoryTests { +struct MusicSearchRepositoryTests { // 🎯 1) 성공 케이스 테스트 @Test("검색 성공 시 결과가 올바르게 반환 ") @@ -43,8 +42,8 @@ struct MockMusicSearchRepositoryTests { ) ] - let repository = MockMusicSearchRepository() - await repository.setResult(.success(mockTracks)) + let repository = MockMusicSearchRepository() + repository.setResult(.success(mockTracks)) // when let result = try await repository.fetchMusic(search: "봄") @@ -76,4 +75,95 @@ struct MockMusicSearchRepositoryTests { #expect(repository.receivedQueries == ["유다빈밴드"]) } + + // 🎯 searchMusic 메서드 테스트 (with filters) + @Test("searchMusic 성공 시 결과가 올바르게 반환 (with filters)") + func testSearchMusicWithFiltersSuccess() async throws { + // given + let mockTracks: [Model.ITunesTrack] = [ + .init( + wrapperType: "track", + kind: "song", + artistId: 1, + collectionId: 10, + trackId: 100, + artistName: "IU", + collectionName: "Spring Album", + trackName: "Spring Love", + previewUrl: URL(string: "https://example.com/prev.m4a"), + artworkUrl100: URL(string: "https://example.com/art.jpg"), + releaseDate: "2024-03-18T12:00:00Z", + primaryGenreName: "K-Pop", + collectionCensoredName: "봄 사랑 벚꽃 말고 - Single" + ) + ] + + let repository = MockMusicSearchRepository() + repository.setResult(.success(mockTracks)) + + // when + let result = try await repository.searchMedia( + query: "IU", + media: "music", + entity: "song" + ) + + // then + #expect(result.count == 1) + #expect(result.first?.artistName == "IU") + #expect(result.first?.trackName == "Spring Love") + #expect(result.first?.collectionCensoredName == "봄 사랑 벚꽃 말고 - Single") + } + + @Test("searchMusic 실패 시 에러를 던져야 함 (with filters)") + func testSearchMusicWithFiltersFailure() async throws { + // given + let repository = MockMusicSearchRepository() + repository.setResult(.failure(MockMusicSearchRepository.MockError.forced)) + + // when / then + await #expect(throws: MockMusicSearchRepository.MockError.forced) { + try await repository.searchMedia( + query: "fail", + media: "music", + entity: "song" + ) + } + } + + @Test("searchMusic 호출 시 모든 파라미터가 기록되어야 함 (with filters)") + func testSearchMusicWithFiltersReceivedParameters() async throws { + let repository = MockMusicSearchRepository(result: .success([])) + _ = try await repository.searchMedia( + query: "IU", + media: "music", + entity: "song" + ) + + #expect(repository.receivedQueries == ["IU|music|song"]) + } + + @Test("searchMusic 다양한 media, entity 조합 테스트 (with filters)") + func testSearchMusicWithFiltersDifferentParameters() async throws { + let repository = MockMusicSearchRepository(result: .success([])) + + // 첫 번째 호출 + _ = try await repository.searchMedia( + query: "Taylor Swift", + media: "music", + entity: "album" + ) + + // 두 번째 호출 + _ = try await repository.searchMedia( + query: "Avengers", + media: "movie", + entity: "movieArtist" + ) + + #expect(repository.receivedQueries == [ + "Taylor Swift|music|album", + "Avengers|movie|movieArtist" + ]) + } } diff --git a/Projects/Core/Data/Repository/Sources/Detail/MusicDetailRepository.swift b/Projects/Core/Data/Repository/Sources/Detail/MusicDetailRepository.swift index c2c88da..f569ec6 100644 --- a/Projects/Core/Data/Repository/Sources/Detail/MusicDetailRepository.swift +++ b/Projects/Core/Data/Repository/Sources/Detail/MusicDetailRepository.swift @@ -7,7 +7,7 @@ import Foundation -import Service +import NetworkService import DataInterface import AsyncMoya diff --git a/Projects/Core/Data/Repository/Sources/Search/MockMusicSearchRepository.swift b/Projects/Core/Data/Repository/Sources/Search/MockMusicSearchRepository.swift index d5fa21c..772c4e5 100644 --- a/Projects/Core/Data/Repository/Sources/Search/MockMusicSearchRepository.swift +++ b/Projects/Core/Data/Repository/Sources/Search/MockMusicSearchRepository.swift @@ -23,7 +23,16 @@ public final class MockMusicSearchRepository: MusicSearchRepositoryProtocol, @un } public func fetchMusic(search: String) async throws -> [Model.ITunesTrack] { - self.receivedQueries.append(search) // 호출 파라미터 검증용 + self.receivedQueries.append(search) + return try result.get() + } + + public func searchMedia( + query: String, + media: String, + entity: String + ) async throws -> [ITunesTrack] { + self.receivedQueries.append("\(query)|\(media)|\(entity)") return try result.get() } } diff --git a/Projects/Core/Data/Repository/Sources/Search/MusicSearchRepository.swift b/Projects/Core/Data/Repository/Sources/Search/MusicSearchRepository.swift index 526f0df..51796d6 100644 --- a/Projects/Core/Data/Repository/Sources/Search/MusicSearchRepository.swift +++ b/Projects/Core/Data/Repository/Sources/Search/MusicSearchRepository.swift @@ -6,7 +6,7 @@ // import Foundation -import Service +import NetworkService import DataInterface import AsyncMoya @@ -17,7 +17,30 @@ public final class MusicSearchRepository: MusicSearchRepositoryProtocol { nonisolated public init() {} public func fetchMusic(search: String) async throws -> [Model.ITunesTrack] { - let data = try await provider.request(.searchMusic(query: search), decodeTo: ITunesSearchResponseDTO.self) + let data = try await provider.request( + .searchMusic( + query: search, + media: "music", + entity: "song" + ), + decodeTo: ITunesSearchResponseDTO.self + ) + return data.results + } + + public func searchMedia( + query: String, + media: String, + entity: String + ) async throws -> [Model.ITunesTrack] { + let data = try await provider.request( + .searchMusic( + query: query, + media: media, + entity: entity + ), + decodeTo: ITunesSearchResponseDTO.self + ) return data.results } } diff --git a/Projects/Core/Domain/DomainInterface/DomainInterface.xcodeproj/project.pbxproj b/Projects/Core/Domain/DomainInterface/DomainInterface.xcodeproj/project.pbxproj index e1f6fd4..3e91ff6 100644 --- a/Projects/Core/Domain/DomainInterface/DomainInterface.xcodeproj/project.pbxproj +++ b/Projects/Core/Domain/DomainInterface/DomainInterface.xcodeproj/project.pbxproj @@ -3,20 +3,20 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ + 0928316C61A62A91B651C8BA /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */; }; 16A76FED32C6B714CAF33D2B /* Entity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06F92106B46658C4D05E4ABB /* Entity.framework */; }; + 2992EC2E8745BEB058AF1966 /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */; }; 353BF1AD56F4CC357E19D719 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8C9CF1C2E1A74CF11222B2 /* Test.swift */; }; 57E5E0940F81FC8D1DFD045E /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35D56B0B55DD9F93D8170AD5 /* DomainInterface.framework */; }; 6DAACDFF7943CB37965B2368 /* Entity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06F92106B46658C4D05E4ABB /* Entity.framework */; }; 72E1BB6284DCE3777F9AFFC6 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6EEC0400C29FD0B52020310 /* Model.framework */; }; - 7F1AC73B2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */; }; - 7F1AC73C2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */; }; - 7F1AC73D2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */; }; - 7F1AC73E2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */; }; 82EC8CCB6C2A84301319D45F /* MusicSearchUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1AC6CCA9E4B674786DC31 /* MusicSearchUseCaseProtocol.swift */; }; + 8C06222FDCD293DE7531E45E /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */; }; + 946C9BBD5502349FCEF7611F /* MusicDetailUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */; }; AB7D4D041B1B69901FBE2092 /* Entity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 06F92106B46658C4D05E4ABB /* Entity.framework */; }; AF5BC2589B071B38F7BA40A8 /* MusicSearchUseCaseProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A1AC6CCA9E4B674786DC31 /* MusicSearchUseCaseProtocol.swift */; }; BC207C9DA5E4673477A9C014 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6EEC0400C29FD0B52020310 /* Model.framework */; }; @@ -97,7 +97,6 @@ 276BFC70D11B277656C925C7 /* DomainInterface_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 35D56B0B55DD9F93D8170AD5 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5C8C9CF1C2E1A74CF11222B2 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; - 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCaseProtocol.swift; sourceTree = ""; }; A9A1AC6CCA9E4B674786DC31 /* MusicSearchUseCaseProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchUseCaseProtocol.swift; sourceTree = ""; }; AC3A341CE5DE046E57E6FA49 /* DomainInterface-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DomainInterface-Info.plist"; sourceTree = ""; }; C6834A89F3FE887DA1691EBA /* DomainInterface_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -106,6 +105,7 @@ D88D9EC758647A9B9DC71766 /* DomainInterface-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DomainInterface-Prod-Info.plist"; sourceTree = ""; }; DFB2548120357952CE45DE62 /* DomainInterfaceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DomainInterfaceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E9AE163D3AF166D0DDCB02F4 /* DomainInterfaceTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "DomainInterfaceTests-Info.plist"; sourceTree = ""; }; + FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCaseProtocol.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -213,7 +213,7 @@ D5F4384B64B2AC2E7BFC4AB1 /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC73A2EB44EF000C82441 /* MusicDetailUseCaseProtocol.swift */, + FBE0E43C05AEF5A2BB70B3B4 /* MusicDetailUseCaseProtocol.swift */, A9A1AC6CCA9E4B674786DC31 /* MusicSearchUseCaseProtocol.swift */, ); path = Sources; @@ -344,6 +344,8 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; }; buildConfigurationList = A6A33577101613ED4870CAD3 /* Build configuration list for PBXProject "DomainInterface" */; compatibilityVersion = "Xcode 14.0"; @@ -410,7 +412,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC73B2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */, + 8C06222FDCD293DE7531E45E /* MusicDetailUseCaseProtocol.swift in Sources */, F50AAC1F42DFDBC5F759A4A5 /* MusicSearchUseCaseProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -427,7 +429,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC73D2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */, + 2992EC2E8745BEB058AF1966 /* MusicDetailUseCaseProtocol.swift in Sources */, 82EC8CCB6C2A84301319D45F /* MusicSearchUseCaseProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -436,7 +438,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC73E2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */, + 0928316C61A62A91B651C8BA /* MusicDetailUseCaseProtocol.swift in Sources */, DF2884833774231E52AF9EDF /* MusicSearchUseCaseProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -445,7 +447,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC73C2EB44EF800C82441 /* MusicDetailUseCaseProtocol.swift in Sources */, + 946C9BBD5502349FCEF7611F /* MusicDetailUseCaseProtocol.swift in Sources */, AF5BC2589B071B38F7BA40A8 /* MusicSearchUseCaseProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -552,7 +554,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -735,7 +740,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -769,7 +777,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -796,7 +807,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -828,7 +842,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Projects/Core/Domain/DomainInterface/Sources/MusicSearchUseCaseProtocol.swift b/Projects/Core/Domain/DomainInterface/Sources/MusicSearchUseCaseProtocol.swift index 021398e..56d1550 100644 --- a/Projects/Core/Domain/DomainInterface/Sources/MusicSearchUseCaseProtocol.swift +++ b/Projects/Core/Domain/DomainInterface/Sources/MusicSearchUseCaseProtocol.swift @@ -9,5 +9,7 @@ import Entity public protocol MusicSearchUseCaseProtocol { func searchMusic(searchQuery: String) async throws -> [MusicItem] + func searchMedia(query: String, media: String, entity: String) async throws -> [MusicItem] + func getCategoryCount(from results: [MusicItem], category: SearchCategory) -> Int } diff --git a/Projects/Core/Domain/Entity/Entity.xcodeproj/project.pbxproj b/Projects/Core/Domain/Entity/Entity.xcodeproj/project.pbxproj index 01b9c09..67e4d28 100644 --- a/Projects/Core/Domain/Entity/Entity.xcodeproj/project.pbxproj +++ b/Projects/Core/Domain/Entity/Entity.xcodeproj/project.pbxproj @@ -7,25 +7,37 @@ objects = { /* Begin PBXBuildFile section */ + 1022968E9E88244875771FDC /* TrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */; }; + 20A43A513E7CE824AB6F42DE /* TrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */; }; 26637FEAAF6E92566882396C /* Extension+ITunesTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C15508F026561321E66FA30 /* Extension+ITunesTrack.swift */; }; 2D03CA2C570A9109D652BC26 /* MusicItemEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */; }; 31197937A1D4461A2256B3F8 /* MusicMockItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E971608AC4068DF3CBC8A070 /* MusicMockItem.swift */; }; 315668DE15E7423930386AD9 /* Extension+ITunesTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C15508F026561321E66FA30 /* Extension+ITunesTrack.swift */; }; + 4059036F6610B22F3F1F4718 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */; }; 514358F473B977D6998A5328 /* MusicItemEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */; }; 5700ECA6FD38B77D693B0091 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 209525459216D5CD40B81F82 /* Model.framework */; }; + 6E1B58C0AC6076AFBF9E9021 /* TrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */; }; + 743B00BEE2C7E9A2BC69CC9B /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */; }; 7748591064D7F18DEDC170E8 /* Extension+ITunesTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C15508F026561321E66FA30 /* Extension+ITunesTrack.swift */; }; + 894504CE87ACF656CE6E71FF /* MediaType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33161ED6C2582E60B68D6CB /* MediaType.swift */; }; 8DDFB394D5E113C3B755D22A /* MusicMockItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E971608AC4068DF3CBC8A070 /* MusicMockItem.swift */; }; 8EFBDFE48EE37EC4A310E3F5 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 209525459216D5CD40B81F82 /* Model.framework */; }; 9A0C98812BF5FFA414CFB1CA /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 209525459216D5CD40B81F82 /* Model.framework */; }; + 9DF368E8595DC143A19ED2CF /* TrendingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */; }; A6C56B79EAC01CFB56CFA225 /* Extension+ITunesTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C15508F026561321E66FA30 /* Extension+ITunesTrack.swift */; }; A7731722AD26181D6EBEE9A0 /* Entity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D3D722D8A39C97CE4035A34 /* Entity.framework */; }; A94899DD76F2414693593542 /* MusicItemEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */; }; AF1789C006A58CA9506AB849 /* MusicItemEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */; }; + B0E388AA936BECC5B1A0115C /* MediaType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33161ED6C2582E60B68D6CB /* MediaType.swift */; }; B8295BFA896386EF552B4F93 /* MusicMockItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E971608AC4068DF3CBC8A070 /* MusicMockItem.swift */; }; + CB6DDEC703ACF435FE9AE761 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */; }; D5AB84F03933D55C5618D8B9 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 209525459216D5CD40B81F82 /* Model.framework */; }; + D93E83DCC456A8AE0AA71D7D /* MediaType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33161ED6C2582E60B68D6CB /* MediaType.swift */; }; E3A1102D7A459CEBD9454CF1 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F3475DDDF8FD92B3EADBBA9 /* Test.swift */; }; + E5E4DC2C245099A3575E4960 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */; }; EAF9FA5186D62449AA07F8B3 /* Model.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 209525459216D5CD40B81F82 /* Model.framework */; }; F6F50DB9F05530FCCC71AAEB /* MusicMockItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E971608AC4068DF3CBC8A070 /* MusicMockItem.swift */; }; + F73666FE36D4AF0B784B6CB6 /* MediaType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A33161ED6C2582E60B68D6CB /* MediaType.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -132,6 +144,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategory.swift; sourceTree = ""; }; 209525459216D5CD40B81F82 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 40EBC703573820B17E0EC445 /* Entity-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Entity-Prod-Info.plist"; sourceTree = ""; }; 6C15508F026561321E66FA30 /* Extension+ITunesTrack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+ITunesTrack.swift"; sourceTree = ""; }; @@ -139,6 +152,8 @@ 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicItemEntity.swift; sourceTree = ""; }; 7F3475DDDF8FD92B3EADBBA9 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; 84059943E0A3A48A809F3C4C /* Entity-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Entity-Debug-Info.plist"; sourceTree = ""; }; + 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendingItem.swift; sourceTree = ""; }; + A33161ED6C2582E60B68D6CB /* MediaType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaType.swift; sourceTree = ""; }; A74AA0F8625D0A07993367BF /* EntityTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EntityTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; A87997AABEB213C299AB6029 /* Entity_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Entity_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ABA430F34FE184D117992A67 /* Entity_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Entity_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -269,8 +284,11 @@ isa = PBXGroup; children = ( CCAF9F5F6A2A60E72936D2C8 /* Mapper */, + A33161ED6C2582E60B68D6CB /* MediaType.swift */, 73EF97D2E9EB60245C744B49 /* MusicItemEntity.swift */, E971608AC4068DF3CBC8A070 /* MusicMockItem.swift */, + 1C4AF6E3E778A724ADA6F635 /* SearchCategory.swift */, + 993E6B1DDFF597E0836E1D2B /* TrendingItem.swift */, ); path = Sources; sourceTree = ""; @@ -467,8 +485,11 @@ buildActionMask = 2147483647; files = ( 315668DE15E7423930386AD9 /* Extension+ITunesTrack.swift in Sources */, + 894504CE87ACF656CE6E71FF /* MediaType.swift in Sources */, AF1789C006A58CA9506AB849 /* MusicItemEntity.swift in Sources */, 31197937A1D4461A2256B3F8 /* MusicMockItem.swift in Sources */, + E5E4DC2C245099A3575E4960 /* SearchCategory.swift in Sources */, + 6E1B58C0AC6076AFBF9E9021 /* TrendingItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -477,8 +498,11 @@ buildActionMask = 2147483647; files = ( 26637FEAAF6E92566882396C /* Extension+ITunesTrack.swift in Sources */, + F73666FE36D4AF0B784B6CB6 /* MediaType.swift in Sources */, 514358F473B977D6998A5328 /* MusicItemEntity.swift in Sources */, F6F50DB9F05530FCCC71AAEB /* MusicMockItem.swift in Sources */, + 4059036F6610B22F3F1F4718 /* SearchCategory.swift in Sources */, + 1022968E9E88244875771FDC /* TrendingItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -487,8 +511,11 @@ buildActionMask = 2147483647; files = ( 7748591064D7F18DEDC170E8 /* Extension+ITunesTrack.swift in Sources */, + D93E83DCC456A8AE0AA71D7D /* MediaType.swift in Sources */, 2D03CA2C570A9109D652BC26 /* MusicItemEntity.swift in Sources */, B8295BFA896386EF552B4F93 /* MusicMockItem.swift in Sources */, + CB6DDEC703ACF435FE9AE761 /* SearchCategory.swift in Sources */, + 20A43A513E7CE824AB6F42DE /* TrendingItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -497,8 +524,11 @@ buildActionMask = 2147483647; files = ( A6C56B79EAC01CFB56CFA225 /* Extension+ITunesTrack.swift in Sources */, + B0E388AA936BECC5B1A0115C /* MediaType.swift in Sources */, A94899DD76F2414693593542 /* MusicItemEntity.swift in Sources */, 8DDFB394D5E113C3B755D22A /* MusicMockItem.swift in Sources */, + 743B00BEE2C7E9A2BC69CC9B /* SearchCategory.swift in Sources */, + 9DF368E8595DC143A19ED2CF /* TrendingItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Projects/Core/Domain/Entity/Sources/Mapper/Extension+ITunesTrack.swift b/Projects/Core/Domain/Entity/Sources/Mapper/Extension+ITunesTrack.swift index 2545ce0..3456b15 100644 --- a/Projects/Core/Domain/Entity/Sources/Mapper/Extension+ITunesTrack.swift +++ b/Projects/Core/Domain/Entity/Sources/Mapper/Extension+ITunesTrack.swift @@ -12,10 +12,31 @@ import Model public extension ITunesTrack { func toDomain() -> MusicItem? { - guard let artwork = artworkUrl100 else { + guard + let trackId, + let trackName, + let artistName, + let artwork = artworkUrl100 + else { return nil } + // wrapperType과 kind를 사용해서 MediaType 결정 + let mediaType: MediaType = { + guard let kind = kind else { return .other } + + switch kind.lowercased() { + case "song": + return .music + case "feature-movie", "movie": + return .movie + case "podcast": + return .podcast + default: + return .other + } + }() + return MusicItem( trackId: trackId, trackName: trackName, @@ -23,9 +44,10 @@ public extension ITunesTrack { artist: artistName, artworkURL: artwork, previewURL: previewUrl, - releaseDate: releaseDate, - aboutAlbumInfo: collectionCensoredName, - genre: primaryGenreName + releaseDate: releaseDate ?? "", + aboutAlbumInfo: collectionCensoredName ?? collectionName ?? "", + genre: primaryGenreName ?? "", + mediaType: mediaType ) } } diff --git a/Projects/Core/Domain/Entity/Sources/MediaType.swift b/Projects/Core/Domain/Entity/Sources/MediaType.swift new file mode 100644 index 0000000..c83dddb --- /dev/null +++ b/Projects/Core/Domain/Entity/Sources/MediaType.swift @@ -0,0 +1,15 @@ +// +// MediaType.swift +// Entity +// +// Created by Wonji Suh on 10/28/25. +// + +import Foundation + +public enum MediaType: String, Codable, CaseIterable { + case music = "music" + case movie = "movie" + case podcast = "podcast" + case other = "other" +} diff --git a/Projects/Core/Domain/Entity/Sources/MusicItemEntity.swift b/Projects/Core/Domain/Entity/Sources/MusicItemEntity.swift index 22e6477..b75cc7b 100644 --- a/Projects/Core/Domain/Entity/Sources/MusicItemEntity.swift +++ b/Projects/Core/Domain/Entity/Sources/MusicItemEntity.swift @@ -7,6 +7,8 @@ import Foundation + + public struct MusicItem: Identifiable, Equatable { public var id = UUID() public let trackId: Int @@ -18,6 +20,7 @@ public struct MusicItem: Identifiable, Equatable { public let releaseDate: String public let aboutAlbumInfo: String public let genre: String + public let mediaType: MediaType public init( trackId: Int, @@ -28,7 +31,8 @@ public struct MusicItem: Identifiable, Equatable { previewURL: URL? = nil, releaseDate: String, aboutAlbumInfo: String = "", - genre: String + genre: String, + mediaType: MediaType = .music ) { self.trackId = trackId self.trackName = trackName @@ -39,6 +43,7 @@ public struct MusicItem: Identifiable, Equatable { self.releaseDate = releaseDate self.aboutAlbumInfo = aboutAlbumInfo self.genre = genre + self.mediaType = mediaType } } @@ -79,7 +84,44 @@ public extension MusicItem { previewURL: URL(string: "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview211/v4/21/0e/1e/210e1e3f-2b94-eca8-8a9b-19403bd2ef71/mzaf_5723681619052556286.plus.aac.p.m4a"), releaseDate: "2025-09-15T12:00:00Z", aboutAlbumInfo: "CODA", - genre: "록" + genre: "록", + mediaType: .music ) } } + + +// MARK: - Array Extension for Filtering +public extension Array where Element == MusicItem { + func filterByCategory(_ category: SearchCategory) -> [MusicItem] { + switch category { + case .all: + return self + case .music: + return filter { $0.mediaType == .music } + case .movies: + return filter { $0.mediaType == .movie } + case .podcast: + return filter { $0.mediaType == .podcast } + case .etc: + return filter { $0.mediaType == .other } + } + } + + var musicCount: Int { filter { $0.mediaType == .music }.count } + var movieCount: Int { filter { $0.mediaType == .movie }.count } + var podcastCount: Int { filter { $0.mediaType == .podcast }.count } + var etcCount: Int { filter { $0.mediaType == .other }.count } + + /// 최신 순으로 정렬 (releaseDate 기준 내림차순) + func sortedByLatest() -> [MusicItem] { + return sorted { lhs, rhs in + guard let lhsDate = lhs.releaseDateValue, + let rhsDate = rhs.releaseDateValue else { + // 날짜가 없는 경우 맨 뒤로 + return lhs.releaseDateValue != nil + } + return lhsDate > rhsDate // 최신이 먼저 오도록 + } + } +} diff --git a/Projects/Core/Domain/Entity/Sources/SearchCategory.swift b/Projects/Core/Domain/Entity/Sources/SearchCategory.swift new file mode 100644 index 0000000..e999bd9 --- /dev/null +++ b/Projects/Core/Domain/Entity/Sources/SearchCategory.swift @@ -0,0 +1,17 @@ +// +// SearchCategory.swift +// Entity +// +// Created by Wonji Suh on 10/28/25. +// + +import Foundation + +public enum SearchCategory: String, CaseIterable { + case all = "All" + case music = "Music" + case movies = "Movies" + case podcast = "Podcast" + case etc = "ETC" +} + diff --git a/Projects/Core/Domain/Entity/Sources/TrendingItem.swift b/Projects/Core/Domain/Entity/Sources/TrendingItem.swift new file mode 100644 index 0000000..345c246 --- /dev/null +++ b/Projects/Core/Domain/Entity/Sources/TrendingItem.swift @@ -0,0 +1,17 @@ +// +// TrendingItem.swift +// Entity +// +// Created by Wonji Suh on 10/28/25. +// + +import Foundation + +public struct TrendingItem: Identifiable, Hashable { + public let id = UUID() + public let title: String + + public init(title: String) { + self.title = title + } +} diff --git a/Projects/Core/Domain/UseCase/Sources/Search/MusicSearchUseCase.swift b/Projects/Core/Domain/UseCase/Sources/Search/MusicSearchUseCase.swift index d1215fe..0a3966e 100644 --- a/Projects/Core/Domain/UseCase/Sources/Search/MusicSearchUseCase.swift +++ b/Projects/Core/Domain/UseCase/Sources/Search/MusicSearchUseCase.swift @@ -28,6 +28,37 @@ public struct MusicSearchUseCase: MusicSearchUseCaseProtocol { let dto = try await repository.fetchMusic(search: searchQuery) return dto.toDomain() } + + public func searchMedia( + query: String, + media: String, + entity: String + ) async throws -> [MusicItem] { + let dtos = try await repository.searchMedia( + query: query, + media: media, + entity: entity + ) + return dtos.toDomain() + } + + public func getCategoryCount( + from results: [MusicItem], + category: SearchCategory + ) -> Int { + switch category { + case .all: + return results.count + case .music: + return results.musicCount + case .movies: + return results.movieCount + case .podcast: + return results.podcastCount + case .etc: + return results.etcCount + } + } } diff --git a/Projects/Core/Domain/UseCase/UseCase.xcodeproj/project.pbxproj b/Projects/Core/Domain/UseCase/UseCase.xcodeproj/project.pbxproj index 05a29bc..1b93e81 100644 --- a/Projects/Core/Domain/UseCase/UseCase.xcodeproj/project.pbxproj +++ b/Projects/Core/Domain/UseCase/UseCase.xcodeproj/project.pbxproj @@ -3,30 +3,32 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ 00DFC76D5E73EFAACB117244 /* IdentifiedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2E0EC679FC135E5CEC0A9AD /* IdentifiedCollections.framework */; }; 014438C30E3FBCFDF9D90E75 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A733A7597F14F4728F8A5C0C /* swift-composable-architecture_ComposableArchitecture.bundle */; }; + 02F952EA56AF7AF43785A4AA /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */; }; 039F640F54A3DEE46842069F /* ConcurrencyExtras.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B60FF119A6FEF6D0D51AE5B /* ConcurrencyExtras.framework */; }; 03B706DEBBD0E4F94AEBD367 /* ComposableArchitecture.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A06ABB2F1523CED2E74B4851 /* ComposableArchitecture.framework */; }; 0518EA00A190B30C0F17D7A1 /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57E0D39ADB0EDA14D1AECB21 /* AsyncMoya.framework */; }; 071B981F0D2DF826183B79CB /* UIKitNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D748E68EDF03BA484791AC0E /* UIKitNavigation.framework */; }; 0E8079E210A702DE84224A0F /* MusicSearchUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736374D98427021184233CEA /* MusicSearchUseCaseTests.swift */; }; 13D48166F46D9317D55B2CF3 /* Clocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6AA0797B504174C847E8FE95 /* Clocks.framework */; }; + 198AFD5AB5E091E294F614AA /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */; }; + 1B618962AF71BB5354C4B739 /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */; }; 1F52B4C183ED7440BB0008C5 /* ComposableArchitecture.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A06ABB2F1523CED2E74B4851 /* ComposableArchitecture.framework */; }; 225CEFCE42B0B52EADC274BD /* CombineSchedulers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A7443ABF2BF970A68F68C39 /* CombineSchedulers.framework */; }; - 240DC4A00D69459A8E3245F0 /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */; }; 25E0B791089D72B6B8C172C9 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 9F4ACA03FCFFBB51D80448FF /* Alamofire_Alamofire.bundle */; }; 27BC664E66CCF74669CFCB4A /* UIKitNavigationShim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44D709557E90FBEF8A8A4305 /* UIKitNavigationShim.framework */; }; 3AD9817DB1EA153D26CA1169 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB9702202A42059A564824B3 /* DomainInterface.framework */; }; - 3CC8A123B783E8673857C787 /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */; }; 4AD89C18B506171EE4B7B14C /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E18B0DBA8AF99C0DB2DBE2C8 /* Alamofire.framework */; }; 4DEF70A10ABBC302AF66D19B /* Repository.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6C51192BCDE8A7E9252657C2 /* Repository.framework */; }; 4FA5872040E01A8D68F66F8E /* ComposableArchitecture.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = A06ABB2F1523CED2E74B4851 /* ComposableArchitecture.framework */; }; 504D664D011D018429E293BF /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB9702202A42059A564824B3 /* DomainInterface.framework */; }; 532676483F2C2203F76AB474 /* XCTestDynamicOverlay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 008DF05C3439EA6B9FDCF073 /* XCTestDynamicOverlay.framework */; }; + 5372B2209B337207CCD9920B /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */; }; 53964ABDA1F713C74C8BCD32 /* WeaveDI.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E19624172169EC662A81D26B /* WeaveDI.framework */; }; 541697140A6418A997A49C8E /* UseCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 981DA49FF8FB5D20F6052CD5 /* UseCase.framework */; }; 546C4C7902FF0E1EBD659ED0 /* PerceptionCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85FEAEF231E31B0754B21769 /* PerceptionCore.framework */; }; @@ -34,26 +36,22 @@ 5C4F067A4986D6C4E2EB4B7F /* DataInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8685E99C5809D7529D75E04 /* DataInterface.framework */; }; 5EBB8D1D64C397045A54E614 /* Repository.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6C51192BCDE8A7E9252657C2 /* Repository.framework */; }; 5EDB47A27CE022305A0209FB /* OrderedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 275036982500E63F980B08D3 /* OrderedCollections.framework */; }; - 5FF798A0F87D336CEE09550E /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */; }; 639F5DA2F5E386011A7ACD8D /* CasePaths.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 319E89CCC442C21B32EE3C8A /* CasePaths.framework */; }; 657EB28029C3DF0D4B44A8EE /* Repository.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6C51192BCDE8A7E9252657C2 /* Repository.framework */; }; 664A65FD9E33A7DAD26452DB /* WeaveDI.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E19624172169EC662A81D26B /* WeaveDI.framework */; }; + 681B59B624135B8963E94DBD /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */; }; 6975BADA2D98E7E45589D8B8 /* WeaveDI.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E19624172169EC662A81D26B /* WeaveDI.framework */; }; 69FE9998125892D8133F27C1 /* WeaveDI.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = E19624172169EC662A81D26B /* WeaveDI.framework */; }; 6F8C0740809FF4FA4ECB5419 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA48A0D2804DC03C431C9190 /* OSLog.framework */; }; 731AA6801D9807916BF43DFA /* WeaveDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E19624172169EC662A81D26B /* WeaveDI.framework */; }; + 731B37C1292D75FA88ED8018 /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */; }; 74CF85AA8553EF14DCDD88DB /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EF7E8BB122749DE3A5B8126 /* Networking.framework */; }; 75D5489B5B030315F847CEC7 /* Sharing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCE5B4C0845929AAD691396C /* Sharing.framework */; }; 76C16B36E81AF240140426DA /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB9702202A42059A564824B3 /* DomainInterface.framework */; }; 7AC6377C2F512F8932492065 /* ComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A06ABB2F1523CED2E74B4851 /* ComposableArchitecture.framework */; }; + 7C0D24F76196EC64C72F4C31 /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */; }; 7CACD226B24EC1A16A8C2348 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB46CD1936DD40DFF06F6E70 /* RxSwift.framework */; }; 7DAC805575823E4D03899B13 /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097C8502B89ACBB0F0A6B3DF /* Foundations.framework */; }; - 7F1AC7432EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */; }; - 7F1AC7442EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */; }; - 7F1AC7452EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */; }; - 7F1AC7462EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */; }; - 7F1AC74A2EB452AF00C82441 /* MusicDetailUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F1AC7492EB452AB00C82441 /* MusicDetailUseCaseTests.swift */; }; - 87E1677F90F2EA114F5A9ED7 /* MusicSearchUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */; }; 89E0A31F51C1EB7029936363 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB9702202A42059A564824B3 /* DomainInterface.framework */; }; 8D33245E18919C5183CF8240 /* Sharing2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF32355A546906AD16B4026C /* Sharing2.framework */; }; 937A580AE4C073DC1A3135BF /* swift-composable-architecture_ComposableArchitecture.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = A733A7597F14F4728F8A5C0C /* swift-composable-architecture_ComposableArchitecture.bundle */; }; @@ -61,6 +59,7 @@ 9A865777262F57D1BDDF8DEF /* Perception.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83C1C4DE45683C912C8DC2B4 /* Perception.framework */; }; 9A939653280A5C9E74F74755 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1A87B170DAF79CF51F0B36C /* CombineMoya.framework */; }; 9C90DE6CD2E6D84469773EB7 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B13814CB96F2A20B29446433 /* Moya.framework */; }; + A0C46FCED0EB66A54C496D60 /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD1487D58F73D83285D2FE1 /* NetworkService.framework */; }; A1C2AEADA890142CC5638C31 /* Repository.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6C51192BCDE8A7E9252657C2 /* Repository.framework */; }; A705971F0A7C3227E903D5B6 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B922F6F0A84360198FB6043A /* LogMacro.framework */; }; AA2B5ED316624F6155EF75A4 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73410F3CAB67ED344CC3D062 /* RxMoya.framework */; }; @@ -71,13 +70,14 @@ B9C9A498E023667DA2DBE6E9 /* Dependencies.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 506286633FC4DF9633A2E0FD /* Dependencies.framework */; }; BA387595B90C5452EC8C9828 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B1CB2AE5D705F53F062A800 /* API.framework */; }; BB5DA4B960E719E9BC9438A5 /* Repository.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C51192BCDE8A7E9252657C2 /* Repository.framework */; }; + BB89A1BEC3EFE97AD02666B2 /* MusicDetailUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D159E480AC15D9D4B53113D /* MusicDetailUseCaseTests.swift */; }; BE6308218C24F4DC05F90B5E /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD5128DC344D8263474C557 /* CFNetwork.framework */; }; C94613A52F9BFA9FB4F53709 /* InternalCollectionsUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24F1526402401DBFF6736037 /* InternalCollectionsUtilities.framework */; }; CAA123A29015605C00B054B0 /* CustomDump.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BDC4D3A9CC2456F59785C311 /* CustomDump.framework */; }; D5393DB4DF93417EF9EE85BB /* Sharing1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48BCB17D9732330186A8333E /* Sharing1.framework */; }; - DE5D7645FE62EEC5E0714F4E /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7D106A44F676A3F66DBD268 /* Service.framework */; }; DF86D6539983516F0558017B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 9F4ACA03FCFFBB51D80448FF /* Alamofire_Alamofire.bundle */; }; E2FCBD579384B0665935A639 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB9702202A42059A564824B3 /* DomainInterface.framework */; }; + EB54F2D4E5EC5A8A11E4F67E /* MusicDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */; }; EE69B862A9856B56F0FF9AAC /* IssueReportingPackageSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38354F5D61ADD2C05EFA3A60 /* IssueReportingPackageSupport.framework */; }; EFF173319EFF0293CFD30604 /* swift-sharing_Sharing.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 4031F1BD9A9E73F69501493A /* swift-sharing_Sharing.bundle */; }; F2ECBEB3C9CF423819541589 /* SwiftUINavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C2FD116C7A6B0F966929543 /* SwiftUINavigation.framework */; }; @@ -214,6 +214,7 @@ 097C8502B89ACBB0F0A6B3DF /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 156620DF42B5B603B36FFC4D /* UseCase-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "UseCase-Stage-Info.plist"; sourceTree = ""; }; 1C2FD116C7A6B0F966929543 /* SwiftUINavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftUINavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCase.swift; sourceTree = ""; }; 24F1526402401DBFF6736037 /* InternalCollectionsUtilities.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = InternalCollectionsUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 275036982500E63F980B08D3 /* OrderedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28B28AE28B75F4A08064786E /* SwiftNavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftNavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -227,7 +228,7 @@ 4826D1DE20C63945D7E8813B /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48BCB17D9732330186A8333E /* Sharing1.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sharing1.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 491B7F0EBCB2B579DEE44331 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchUseCase.swift; sourceTree = ""; }; + 4D159E480AC15D9D4B53113D /* MusicDetailUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCaseTests.swift; sourceTree = ""; }; 506286633FC4DF9633A2E0FD /* Dependencies.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Dependencies.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57E0D39ADB0EDA14D1AECB21 /* AsyncMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6AA0797B504174C847E8FE95 /* Clocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Clocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -235,8 +236,6 @@ 73410F3CAB67ED344CC3D062 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 736374D98427021184233CEA /* MusicSearchUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchUseCaseTests.swift; sourceTree = ""; }; 765D2D0CA936BA6ADB4F5CE8 /* UseCase_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UseCase_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCase.swift; sourceTree = ""; }; - 7F1AC7492EB452AB00C82441 /* MusicDetailUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicDetailUseCaseTests.swift; sourceTree = ""; }; 83C1C4DE45683C912C8DC2B4 /* Perception.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Perception.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 85FEAEF231E31B0754B21769 /* PerceptionCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PerceptionCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8A7443ABF2BF970A68F68C39 /* CombineSchedulers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineSchedulers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -244,6 +243,7 @@ 9508B8EA67CFEB36EF508AF4 /* UseCase-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "UseCase-Info.plist"; sourceTree = ""; }; 981DA49FF8FB5D20F6052CD5 /* UseCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UseCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9D1B8C349D40AC2EE01758FF /* UseCase-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "UseCase-Debug-Info.plist"; sourceTree = ""; }; + 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicSearchUseCase.swift; sourceTree = ""; }; 9F4ACA03FCFFBB51D80448FF /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; A06ABB2F1523CED2E74B4851 /* ComposableArchitecture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ComposableArchitecture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A733A7597F14F4728F8A5C0C /* swift-composable-architecture_ComposableArchitecture.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-composable-architecture_ComposableArchitecture.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -252,12 +252,12 @@ B903EEF70DF0FB080EFC7B9B /* DependenciesMacros.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DependenciesMacros.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B922F6F0A84360198FB6043A /* LogMacro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LogMacro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B930A91712C71F045FA71426 /* IssueReporting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReporting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBD1487D58F73D83285D2FE1 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BDC4D3A9CC2456F59785C311 /* CustomDump.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CustomDump.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C4016988238AD435EC070B51 /* UseCaseTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "UseCaseTests-Info.plist"; sourceTree = ""; }; D1A87B170DAF79CF51F0B36C /* CombineMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D6FD9521226B13200DEB8FED /* UseCase-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "UseCase-Prod-Info.plist"; sourceTree = ""; }; D748E68EDF03BA484791AC0E /* UIKitNavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UIKitNavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D7D106A44F676A3F66DBD268 /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DB46CD1936DD40DFF06F6E70 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DCE5B4C0845929AAD691396C /* Sharing.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sharing.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DFD5128DC344D8263474C557 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; @@ -310,6 +310,7 @@ A705971F0A7C3227E903D5B6 /* LogMacro.framework in Frameworks */, B2AF891D2D2481ADFD0D1400 /* Model.framework in Frameworks */, 9C90DE6CD2E6D84469773EB7 /* Moya.framework in Frameworks */, + A0C46FCED0EB66A54C496D60 /* NetworkService.framework in Frameworks */, 74CF85AA8553EF14DCDD88DB /* Networking.framework in Frameworks */, 5EDB47A27CE022305A0209FB /* OrderedCollections.framework in Frameworks */, 9A865777262F57D1BDDF8DEF /* Perception.framework in Frameworks */, @@ -317,7 +318,6 @@ BB5DA4B960E719E9BC9438A5 /* Repository.framework in Frameworks */, AA2B5ED316624F6155EF75A4 /* RxMoya.framework in Frameworks */, 7CACD226B24EC1A16A8C2348 /* RxSwift.framework in Frameworks */, - DE5D7645FE62EEC5E0714F4E /* Service.framework in Frameworks */, 75D5489B5B030315F847CEC7 /* Sharing.framework in Frameworks */, D5393DB4DF93417EF9EE85BB /* Sharing1.framework in Frameworks */, 8D33245E18919C5183CF8240 /* Sharing2.framework in Frameworks */, @@ -361,8 +361,8 @@ 24C485C2264AA4D53285980D /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC7412EB44F2B00C82441 /* Detail */, - 7F1AC73F2EB44F1100C82441 /* Search */, + 774A9C615B977A87E3B13641 /* Detail */, + B74D570D506FF2B9E8736238 /* Search */, ); path = Sources; sourceTree = ""; @@ -386,6 +386,14 @@ ); sourceTree = ""; }; + 774A9C615B977A87E3B13641 /* Detail */ = { + isa = PBXGroup; + children = ( + 2187B2DDBEE2CCE9006AFA2C /* MusicDetailUseCase.swift */, + ); + path = Detail; + sourceTree = ""; + }; 78A591603ED90C5371A925D1 /* UseCaseTests */ = { isa = PBXGroup; children = ( @@ -402,26 +410,10 @@ path = Derived; sourceTree = ""; }; - 7F1AC73F2EB44F1100C82441 /* Search */ = { - isa = PBXGroup; - children = ( - 4E8AFBE865C2E9AF6DC86FF8 /* MusicSearchUseCase.swift */, - ); - path = Search; - sourceTree = ""; - }; - 7F1AC7412EB44F2B00C82441 /* Detail */ = { - isa = PBXGroup; - children = ( - 7F1AC7422EB44F3700C82441 /* MusicDetailUseCase.swift */, - ); - path = Detail; - sourceTree = ""; - }; AA59CE1FEA8A06FD9F2BEE42 /* Sources */ = { isa = PBXGroup; children = ( - 7F1AC7492EB452AB00C82441 /* MusicDetailUseCaseTests.swift */, + 4D159E480AC15D9D4B53113D /* MusicDetailUseCaseTests.swift */, 736374D98427021184233CEA /* MusicSearchUseCaseTests.swift */, ); path = Sources; @@ -439,6 +431,14 @@ path = InfoPlists; sourceTree = ""; }; + B74D570D506FF2B9E8736238 /* Search */ = { + isa = PBXGroup; + children = ( + 9EF9EE2705D96633544E0632 /* MusicSearchUseCase.swift */, + ); + path = Search; + sourceTree = ""; + }; BF0062FA29B274A2F9F0E5D9 /* Products */ = { isa = PBXGroup; children = ( @@ -468,13 +468,13 @@ 491B7F0EBCB2B579DEE44331 /* Model.framework */, B13814CB96F2A20B29446433 /* Moya.framework */, 3EF7E8BB122749DE3A5B8126 /* Networking.framework */, + BBD1487D58F73D83285D2FE1 /* NetworkService.framework */, 275036982500E63F980B08D3 /* OrderedCollections.framework */, 83C1C4DE45683C912C8DC2B4 /* Perception.framework */, 85FEAEF231E31B0754B21769 /* PerceptionCore.framework */, 6C51192BCDE8A7E9252657C2 /* Repository.framework */, 73410F3CAB67ED344CC3D062 /* RxMoya.framework */, DB46CD1936DD40DFF06F6E70 /* RxSwift.framework */, - D7D106A44F676A3F66DBD268 /* Service.framework */, DCE5B4C0845929AAD691396C /* Sharing.framework */, 48BCB17D9732330186A8333E /* Sharing1.framework */, EF32355A546906AD16B4026C /* Sharing2.framework */, @@ -620,6 +620,8 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; }; buildConfigurationList = 457FF1DD029A472E8F5461F7 /* Build configuration list for PBXProject "UseCase" */; compatibilityVersion = "Xcode 14.0"; @@ -689,7 +691,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7F1AC74A2EB452AF00C82441 /* MusicDetailUseCaseTests.swift in Sources */, + BB89A1BEC3EFE97AD02666B2 /* MusicDetailUseCaseTests.swift in Sources */, 0E8079E210A702DE84224A0F /* MusicSearchUseCaseTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -698,8 +700,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 240DC4A00D69459A8E3245F0 /* MusicSearchUseCase.swift in Sources */, - 7F1AC7442EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */, + 7C0D24F76196EC64C72F4C31 /* MusicDetailUseCase.swift in Sources */, + 02F952EA56AF7AF43785A4AA /* MusicSearchUseCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -707,8 +709,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3CC8A123B783E8673857C787 /* MusicSearchUseCase.swift in Sources */, - 7F1AC7462EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */, + 198AFD5AB5E091E294F614AA /* MusicDetailUseCase.swift in Sources */, + 5372B2209B337207CCD9920B /* MusicSearchUseCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -716,8 +718,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5FF798A0F87D336CEE09550E /* MusicSearchUseCase.swift in Sources */, - 7F1AC7452EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */, + EB54F2D4E5EC5A8A11E4F67E /* MusicDetailUseCase.swift in Sources */, + 731B37C1292D75FA88ED8018 /* MusicSearchUseCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -725,8 +727,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 87E1677F90F2EA114F5A9ED7 /* MusicSearchUseCase.swift in Sources */, - 7F1AC7432EB44F3700C82441 /* MusicDetailUseCase.swift in Sources */, + 681B59B624135B8963E94DBD /* MusicDetailUseCase.swift in Sources */, + 1B618962AF71BB5354C4B739 /* MusicSearchUseCase.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -770,7 +772,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Stage; SDKROOT = iphoneos; @@ -815,7 +835,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Stage; SDKROOT = iphoneos; @@ -823,7 +861,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -907,14 +948,35 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase.UseCaseTests; PRODUCT_NAME = UseCaseTests; SDKROOT = iphoneos; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -950,7 +1012,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Prod; SDKROOT = iphoneos; @@ -958,7 +1038,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -996,7 +1079,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Prod; SDKROOT = iphoneos; @@ -1041,7 +1142,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase; SDKROOT = iphoneos; @@ -1086,7 +1205,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase; SDKROOT = iphoneos; @@ -1094,7 +1231,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1125,7 +1265,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase.UseCaseTests; PRODUCT_NAME = UseCaseTests; SDKROOT = iphoneos; @@ -1167,7 +1325,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Debug; SDKROOT = iphoneos; @@ -1212,7 +1388,25 @@ "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", ); - OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap -Xcc -fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros -load-plugin-executable $BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros"; + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.UseCase; PRODUCT_NAME = UseCase_Debug; SDKROOT = iphoneos; @@ -1220,7 +1414,10 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; diff --git a/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicDetailUseCaseTests.swift b/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicDetailUseCaseTests.swift index babb203..04b462c 100644 --- a/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicDetailUseCaseTests.swift +++ b/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicDetailUseCaseTests.swift @@ -10,7 +10,7 @@ import Foundation import DomainInterface import DataInterface import Entity -import Repository // (필요 시) +import Repository @testable import UseCase @Suite("MusicDetailUseCaseTests", .tags(.unit, .useCase, .mock)) diff --git a/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicSearchUseCaseTests.swift b/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicSearchUseCaseTests.swift index 567a1e8..4ba21bd 100644 --- a/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicSearchUseCaseTests.swift +++ b/Projects/Core/Domain/UseCase/UseCaseTests/Sources/MusicSearchUseCaseTests.swift @@ -37,7 +37,7 @@ struct MusicSearchUseCaseTests { let items = try await useCase.searchMusic(searchQuery: "유다빈밴드") // Then: 결과 검증 (DTO → Domain 매핑) - #expect(items.count == 2, "결과 개수가 올바르다 ✅") + #expect(items.count == 2, "결과 개수가 올바르다 ") #expect(items[0].trackName == "봄노래", "첫 번째 곡 이름 매핑 확인") #expect(items[0].artist == "아이유", "아티스트 매핑 확인") #expect(items[1].trackName == "여름밤", "두 번째 곡 이름 매핑 확인") @@ -54,4 +54,105 @@ struct MusicSearchUseCaseTests { _ = try await useCase.searchMusic(searchQuery: "fail-me") } } + + @Test("getCategoryCount - 각 카테고리별 정확한 개수 반환") + func testGetCategoryCount() { + // Given: 각 미디어 타입별로 다른 개수의 아이템들 + let musicItems = [ + MusicItem.detailMusicItem, // music + MusicItem(trackId: 2, trackName: "Movie Title", album: "Movie Album", artist: "Director", + artworkURL: URL(string: "https://example.com/movie.jpg")!, previewURL: nil, + releaseDate: "2024-01-01T00:00:00Z", aboutAlbumInfo: "Movie Info", + genre: "Action", mediaType: .movie), + MusicItem(trackId: 3, trackName: "Podcast Episode", album: "Podcast Series", artist: "Host", + artworkURL: URL(string: "https://example.com/podcast.jpg")!, previewURL: nil, + releaseDate: "2024-01-01T00:00:00Z", aboutAlbumInfo: "Episode Info", + genre: "Technology", mediaType: .podcast), + MusicItem(trackId: 4, trackName: "Other Content", album: "Other Album", artist: "Other Artist", + artworkURL: URL(string: "https://example.com/other.jpg")!, previewURL: nil, + releaseDate: "2024-01-01T00:00:00Z", aboutAlbumInfo: "Other Info", + genre: "Unknown", mediaType: .other), + MusicItem(trackId: 5, trackName: "Another Music", album: "Music Album", artist: "Singer", + artworkURL: URL(string: "https://example.com/music2.jpg")!, previewURL: nil, + releaseDate: "2024-01-01T00:00:00Z", aboutAlbumInfo: "Music Info", + genre: "Pop", mediaType: .music) + ] + + let repo = MockMusicSearchRepository() + let useCase = MusicSearchUseCase(repository: repo) + + // Then: 각 카테고리별 정확한 개수 확인 + #expect(useCase.getCategoryCount(from: musicItems, category: .all) == 5, "전체 개수가 5개") + #expect(useCase.getCategoryCount(from: musicItems, category: .music) == 2, "음악 2개") + #expect(useCase.getCategoryCount(from: musicItems, category: .movies) == 1, "영화 1개") + #expect(useCase.getCategoryCount(from: musicItems, category: .podcast) == 1, "팟캐스트 1개") + #expect(useCase.getCategoryCount(from: musicItems, category: .etc) == 1, "기타 1개") + } + + @Test("getCategoryCount - 빈 배열에서 0 반환") + func testGetCategoryCountWithEmptyArray() { + let repo = MockMusicSearchRepository() + let useCase = MusicSearchUseCase(repository: repo) + let emptyItems: [MusicItem] = [] + + // Then: 모든 카테고리에서 0 반환 + #expect(useCase.getCategoryCount(from: emptyItems, category: .all) == 0) + #expect(useCase.getCategoryCount(from: emptyItems, category: .music) == 0) + #expect(useCase.getCategoryCount(from: emptyItems, category: .movies) == 0) + #expect(useCase.getCategoryCount(from: emptyItems, category: .podcast) == 0) + #expect(useCase.getCategoryCount(from: emptyItems, category: .etc) == 0) + } + + @Test("searchMedia 성공 시 올바른 파라미터 전달 및 Domain 변환") + func testSearchMediaSuccessWithCorrectParameters() async throws { + // Given: Mock DTO 데이터 + let dto: [Model.ITunesTrack] = [ + .mock(id: 300, artist: "BTS", name: "Dynamite"), + .mock(id: 400, artist: "BLACKPINK", name: "How You Like That") + ] + let repo = MockMusicSearchRepository(result: .success(dto)) + let useCase = MusicSearchUseCase(repository: repo) + + // When: searchMedia 실행 + let items = try await useCase.searchMedia(query: "K-Pop", media: "music", entity: "song") + + // Then: 올바른 파라미터가 전달되었는지 확인 + #expect(repo.receivedQueries.contains("K-Pop|music|song"), "올바른 파라미터 전달 확인") + + // Domain 변환 확인 + #expect(items.count == 2, "결과 개수가 2개") + #expect(items[0].trackName == "Dynamite", "첫 번째 곡 이름 확인") + #expect(items[0].artist == "BTS", "첫 번째 아티스트 확인") + #expect(items[1].trackName == "How You Like That", "두 번째 곡 이름 확인") + #expect(items[1].artist == "BLACKPINK", "두 번째 아티스트 확인") + } + + @Test("searchMedia 실패 시 에러 전파") + func testSearchMediaFailurePropagatesError() async { + enum SearchError: Error { case networkFailure } + let repo = MockMusicSearchRepository(result: .failure(SearchError.networkFailure)) + let useCase = MusicSearchUseCase(repository: repo) + + await #expect(throws: SearchError.self) { + _ = try await useCase.searchMedia(query: "fail", media: "music", entity: "song") + } + } + + @Test("searchMedia 다양한 미디어 타입 테스트") + func testSearchMediaWithDifferentMediaTypes() async throws { + // Given + let dto: [Model.ITunesTrack] = [.mock(id: 500, artist: "Test Artist", name: "Test Content")] + let repo = MockMusicSearchRepository(result: .success(dto)) + let useCase = MusicSearchUseCase(repository: repo) + + // When: 다양한 미디어 타입으로 검색 + _ = try await useCase.searchMedia(query: "test", media: "movie", entity: "movie") + _ = try await useCase.searchMedia(query: "test", media: "podcast", entity: "podcast") + _ = try await useCase.searchMedia(query: "test", media: "music", entity: "musicTrack") + + // Then: 각각 다른 파라미터가 전달되었는지 확인 + #expect(repo.receivedQueries.contains("test|movie|movie"), "영화 검색 파라미터 확인") + #expect(repo.receivedQueries.contains("test|podcast|podcast"), "팟캐스트 검색 파라미터 확인") + #expect(repo.receivedQueries.contains("test|music|musicTrack"), "음악 검색 파라미터 확인") + } } diff --git a/Projects/Presentation/Detail/Sources/View/Component/NavigationArrowButton.swift b/Projects/Presentation/Detail/Sources/View/Component/NavigationArrowButton.swift index 3b55f7c..cac3aa9 100644 --- a/Projects/Presentation/Detail/Sources/View/Component/NavigationArrowButton.swift +++ b/Projects/Presentation/Detail/Sources/View/Component/NavigationArrowButton.swift @@ -21,13 +21,20 @@ public struct NavigationArrowButton: View { public var body: some View { HStack { - Image(systemName: "chevron.left") - .resizable() - .scaledToFit() - .frame(width: 12, height: 20) - .font(.pretendardFont(family: .semiBold, size: 20)) - .foregroundStyle(.gray) - .onTapGesture(perform: backAction) + Button(action: { + backAction() + }) { + Image(systemName: "chevron.left") + .resizable() + .scaledToFit() + .frame(width: 16, height: 24) + .font(.pretendardFont(family: .semiBold, size: 20)) + .foregroundStyle(.white) + .padding(16) + .background(Color.lightGray100.opacity(0.6)) + .clipShape(Circle()) + } + .buttonStyle(PlainButtonStyle()) Spacer() diff --git a/Projects/Presentation/Detail/Sources/View/Component/ScalingHeaderDetailView.swift b/Projects/Presentation/Detail/Sources/View/Component/ScalingHeaderDetailView.swift index 1ba5691..fd9537e 100644 --- a/Projects/Presentation/Detail/Sources/View/Component/ScalingHeaderDetailView.swift +++ b/Projects/Presentation/Detail/Sources/View/Component/ScalingHeaderDetailView.swift @@ -7,26 +7,27 @@ import SwiftUI import DesignSystem +import ComposableArchitecture struct ScalingHeaderDetailView: View { let headerURL: URL? let isLoading: Bool let headerHeight: CGFloat let content: Content - let backAction: () -> Void + let store: StoreOf init( headerURL: URL?, isLoading: Bool, headerHeight: CGFloat = 400, - backAction: @escaping () -> Void = {}, + store: StoreOf, @ViewBuilder content: () -> Content ) { self.headerURL = headerURL self.isLoading = isLoading self.headerHeight = headerHeight + self.store = store self.content = content() - self.backAction = backAction } var body: some View { @@ -54,7 +55,7 @@ struct ScalingHeaderDetailView: View { } NavigationArrowButton { - backAction() + store.send(.navigation(.backToHome)) } .padding(.leading, 16) .padding(.top, outerGeo.safeAreaInsets.top + 20) diff --git a/Projects/Presentation/Detail/Sources/View/DetailView.swift b/Projects/Presentation/Detail/Sources/View/DetailView.swift index 9c931b5..79c3975 100644 --- a/Projects/Presentation/Detail/Sources/View/DetailView.swift +++ b/Projects/Presentation/Detail/Sources/View/DetailView.swift @@ -26,9 +26,7 @@ public struct DetailView: View { headerURL: store.musicItem?.highResolutionArtworkURL, isLoading: store.isLoading, headerHeight: 400, - backAction: { - store.send(.navigation(.backToHome)) - } + store: store ) { VStack(alignment: .leading, spacing: 24) { if store.isLoading { diff --git a/Projects/Presentation/Home/Home.xcodeproj/project.pbxproj b/Projects/Presentation/Home/Home.xcodeproj/project.pbxproj index 5945f73..aaf040c 100644 --- a/Projects/Presentation/Home/Home.xcodeproj/project.pbxproj +++ b/Projects/Presentation/Home/Home.xcodeproj/project.pbxproj @@ -95,6 +95,7 @@ CF5A1AD2B7353A124DEFE3FA /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47685DD352D9FD3AF017E55A /* EventLimiter.framework */; }; D110469E344FC8C09FBBEDF5 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D35F66BCBA8EB427B5DE027 /* Shared.framework */; }; D2887734A55C3779D0F07A91 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D35F66BCBA8EB427B5DE027 /* Shared.framework */; }; + D361A4421856DAAA37AC805E /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A7C04A43E2FED35200F3150 /* NetworkService.framework */; }; D44449372485F69CE4255B0F /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3A420962362F953BA80583E /* AsyncMoya.framework */; }; D57FDE5B6D33D593026307B3 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AC33FA1CBE648EA8E368396 /* RxSwift.framework */; }; D6B179DE1D84172A299A3386 /* HomeCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C4EF3EB7C1A6C74F1147F89 /* HomeCoordinatorView.swift */; }; @@ -109,7 +110,6 @@ E9D43BAF593CAF5F1FFF9F61 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9B8C07D57418919559FFAA /* HomeView.swift */; }; EA516AB74E3DEC9A46C753FB /* UseCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41DAF9464ED5B473501A8E5 /* UseCase.framework */; }; EB16D4098EB6F7300105D545 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9B8C07D57418919559FFAA /* HomeView.swift */; }; - EC25F61D85E0B3C1933DBE94 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83445F59D3AB1860CA662B01 /* Service.framework */; }; EDA9C77573FEAFFD240920F8 /* Sharing2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1AFE5BA67BCFE27F8907243 /* Sharing2.framework */; }; EE8267884574C1EB7FDF4385 /* Repository.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67B392150F9B03EE0F5089DC /* Repository.framework */; }; EEB1C95A66F2F4AF9A009827 /* Sharing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 947E0603E89507C192DAD1F1 /* Sharing.framework */; }; @@ -260,6 +260,7 @@ 461CA45E92D4D1E043B122B0 /* MusicItemCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicItemCard.swift; sourceTree = ""; }; 47685DD352D9FD3AF017E55A /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 497C681620B7A8EF9A5DB3FD /* IssueReportingPackageSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReportingPackageSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4A7C04A43E2FED35200F3150 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5030B1CA5F8E96AA31793193 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5654B6706EEA1F5AAC932661 /* SwiftUINavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftUINavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5B1A5FAB7ADFFA55459CCD3E /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -277,7 +278,6 @@ 790A0B99EFBC3A10546090C7 /* Home_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Home_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AC33FA1CBE648EA8E368396 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 80B195D2E9E1BDCB82C5AF27 /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 83445F59D3AB1860CA662B01 /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 83AEB3F28F4ADCE16A82780B /* Home-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Home-Stage-Info.plist"; sourceTree = ""; }; 86CBE6ABD83F406A81DA73C8 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 86D2CD13C4F9DEAE3296CC3D /* IssueReporting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReporting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -380,6 +380,7 @@ 3AE6C2658C8A0DAF4FB5AB3D /* LogMacro.framework in Frameworks */, 7F58E3932E6E87D7A775C6A2 /* Model.framework in Frameworks */, C8DC844992B30693A7FEA61D /* Moya.framework in Frameworks */, + D361A4421856DAAA37AC805E /* NetworkService.framework in Frameworks */, A05D017F419E6C39C08B24E6 /* Networking.framework in Frameworks */, 82DAE759D3AC83460AA6238E /* OrderedCollections.framework in Frameworks */, 38B3A6E1533D6FE253C6ABF4 /* Perception.framework in Frameworks */, @@ -387,7 +388,6 @@ EE8267884574C1EB7FDF4385 /* Repository.framework in Frameworks */, 7F5389BC4DC96684F475E3B6 /* RxMoya.framework in Frameworks */, D57FDE5B6D33D593026307B3 /* RxSwift.framework in Frameworks */, - EC25F61D85E0B3C1933DBE94 /* Service.framework in Frameworks */, 6AF94EE489A31CAB497CC765 /* Shared.framework in Frameworks */, EEB1C95A66F2F4AF9A009827 /* Sharing.framework in Frameworks */, 468B9914D424B44F720756D6 /* Sharing1.framework in Frameworks */, @@ -449,13 +449,13 @@ 5030B1CA5F8E96AA31793193 /* Model.framework */, E45A37D9EB117BE8E26CCEAF /* Moya.framework */, D2469AB87A1F38762DA5F745 /* Networking.framework */, + 4A7C04A43E2FED35200F3150 /* NetworkService.framework */, 6D873DEE51BC4C388C330FA8 /* OrderedCollections.framework */, 0A0F2E720C3F270082B6ACA4 /* Perception.framework */, 2F4F09B1E35ECD333CFB4B8C /* PerceptionCore.framework */, 67B392150F9B03EE0F5089DC /* Repository.framework */, 86CBE6ABD83F406A81DA73C8 /* RxMoya.framework */, 7AC33FA1CBE648EA8E368396 /* RxSwift.framework */, - 83445F59D3AB1860CA662B01 /* Service.framework */, 5D35F66BCBA8EB427B5DE027 /* Shared.framework */, 947E0603E89507C192DAD1F1 /* Sharing.framework */, 7026CE15DBCDE0ED6473CE05 /* Sharing1.framework */, diff --git a/Projects/Presentation/Home/HomeTests/Sources/HomeReducerTests.swift b/Projects/Presentation/Home/HomeTests/Sources/HomeReducerTests.swift index 562e681..8aa0c30 100644 --- a/Projects/Presentation/Home/HomeTests/Sources/HomeReducerTests.swift +++ b/Projects/Presentation/Home/HomeTests/Sources/HomeReducerTests.swift @@ -28,11 +28,46 @@ private enum DummyError: Error { case fail } private struct StubMusicSearchUseCase: MusicSearchUseCaseProtocol { let searchHandler: @Sendable (String) async throws -> [MusicItem] let fetchDetailHandler: @Sendable (Int) async throws -> Entity.MusicItem + let searchMediaHandler: @Sendable (String, String, String) async throws -> [Entity.MusicItem] + let getCategoryCountHandler: ([Entity.MusicItem], Entity.SearchCategory) -> Int + + init( + searchHandler: @escaping @Sendable (String) async throws -> [MusicItem], + fetchDetailHandler: @escaping @Sendable (Int) async throws -> Entity.MusicItem, + searchMediaHandler: @escaping @Sendable (String, String, String) async throws -> [Entity.MusicItem] = { _, _, _ in [] }, + getCategoryCountHandler: @escaping ([Entity.MusicItem], Entity.SearchCategory) -> Int = { results, category in + switch category { + case .all: + return results.count + case .music: + return results.musicCount + case .movies: + return results.movieCount + case .podcast: + return results.podcastCount + case .etc: + return results.etcCount + } + } + ) { + self.searchHandler = searchHandler + self.fetchDetailHandler = fetchDetailHandler + self.searchMediaHandler = searchMediaHandler + self.getCategoryCountHandler = getCategoryCountHandler + } func searchMusic(searchQuery: String) async throws -> [MusicItem] { try await searchHandler(searchQuery) } + func searchMedia(query: String, media: String, entity: String) async throws -> [Entity.MusicItem] { + try await searchMediaHandler(query, media, entity) + } + + func getCategoryCount(from results: [Entity.MusicItem], category: Entity.SearchCategory) -> Int { + getCategoryCountHandler(results, category) + } + func fetchTrackDetail(id: Int) async throws -> Entity.MusicItem { try await fetchDetailHandler(id) } @@ -132,7 +167,9 @@ struct HomeReducerTests { store.exhaustivity = .off(showSkippedAssertions: false) - await store.send(.view(.onAppear)) + await store.send(.view(.onAppear)) { state in + state.didTriggerInitialFetch = true + } await store.skipReceivedActions() #expect(store.state.popularMusicModel.count == Fixture.popular.count) @@ -198,4 +235,97 @@ struct HomeReducerTests { #expect(store.state.detailMusicItem?.trackId == picked.trackId) } + + @Test("searchMedia 호출 시 지정한 핸들러와 파라미터 사용") + func searchMedia_usesInjectedHandler() async throws { + let expectedItems: [Entity.MusicItem] = [ + .stub(trackId: 1, trackName: "Song-1"), + .stub(trackId: 2, trackName: "Song-2") + ] + + var captured: (String, String, String)? + + let useCase = StubMusicSearchUseCase( + searchHandler: { _ in Fixture.popular }, + fetchDetailHandler: { _ in .stub() }, + searchMediaHandler: { query, media, entity in + captured = (query, media, entity) + return expectedItems + } + ) + + let result = try await useCase.searchMedia(query: "K-Pop", media: "music", entity: "song") + + #expect(result == expectedItems) + #expect(captured?.0 == "K-Pop") + #expect(captured?.1 == "music") + #expect(captured?.2 == "song") + } + + @Test("getCategoryCount 카테고리별 건수 반환") + func getCategoryCount_returnsCategorySpecificCounts() { + let sampleResults: [Entity.MusicItem] = [ + .init( + trackId: 1, + trackName: "Music", + album: "Album", + artist: "Artist", + artworkURL: URL(string: "https://example.com/1.png")!, + releaseDate: "2024-01-01T00:00:00Z", + genre: "Pop", + mediaType: .music + ), + .init( + trackId: 2, + trackName: "Movie", + album: "Movie Album", + artist: "Director", + artworkURL: URL(string: "https://example.com/2.png")!, + releaseDate: "2024-02-01T00:00:00Z", + genre: "Drama", + mediaType: .movie + ), + .init( + trackId: 3, + trackName: "Podcast", + album: "Podcast Album", + artist: "Host", + artworkURL: URL(string: "https://example.com/3.png")!, + releaseDate: "2024-03-01T00:00:00Z", + genre: "Talk", + mediaType: .podcast + ), + .init( + trackId: 4, + trackName: "Other", + album: "Other Album", + artist: "Creator", + artworkURL: URL(string: "https://example.com/4.png")!, + releaseDate: "2024-04-01T00:00:00Z", + genre: "Misc", + mediaType: .other + ), + .init( + trackId: 5, + trackName: "Music-2", + album: "Second Album", + artist: "Artist", + artworkURL: URL(string: "https://example.com/5.png")!, + releaseDate: "2024-05-01T00:00:00Z", + genre: "Pop", + mediaType: .music + ) + ] + + let useCase = StubMusicSearchUseCase( + searchHandler: { _ in Fixture.popular }, + fetchDetailHandler: { _ in .stub() } + ) + + #expect(useCase.getCategoryCount(from: sampleResults, category: .all) == 5) + #expect(useCase.getCategoryCount(from: sampleResults, category: .music) == 2) + #expect(useCase.getCategoryCount(from: sampleResults, category: .movies) == 1) + #expect(useCase.getCategoryCount(from: sampleResults, category: .podcast) == 1) + #expect(useCase.getCategoryCount(from: sampleResults, category: .etc) == 1) + } } diff --git a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift index 038d660..442461b 100644 --- a/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift +++ b/Projects/Presentation/Home/Sources/Coordinator/Reducer/HomeCoordinator.swift @@ -34,8 +34,11 @@ public struct HomeCoordinator { public enum View { case backToRoot + case switchTapBar } + + private enum CancelID: Hashable { case screen } @@ -67,7 +70,11 @@ extension HomeCoordinator { state.routes.push(.detail(.init(musicItem: item))) return .none + case .routeAction(id: _, action: .home(.navigation(.tapSearch))): + return .send(.view(.switchTapBar)) + case .routeAction(id: _, action: .detail(.navigation(.backToHome))): +// state.routes.goBackToRoot() return .send(.view(.backToRoot)) default: @@ -85,6 +92,8 @@ extension HomeCoordinator { state.routes.goBackTo(\.home) return .none + case .switchTapBar: + return .none } } } diff --git a/Projects/Presentation/Home/Sources/Main /Reducer/HomeReducer.swift b/Projects/Presentation/Home/Sources/Main /Reducer/HomeReducer.swift index d866d2c..755bb70 100644 --- a/Projects/Presentation/Home/Sources/Main /Reducer/HomeReducer.swift +++ b/Projects/Presentation/Home/Sources/Main /Reducer/HomeReducer.swift @@ -24,6 +24,7 @@ public struct HomeReducer { var errorMessage: String? @Shared(.inMemory("MusicItem")) var detailMusicItem: MusicItem? = nil var latestFailedSeason: MusicSeason? + var didTriggerInitialFetch: Bool = false public init() {} } @@ -53,14 +54,17 @@ public struct HomeReducer { @CasePathable public enum NavigationAction: Equatable { case musicCardTapped(item: MusicItem) + case tapSearch } @Dependency(MusicSearchUseCase.self) var musicSearchUseCase @Dependency(\.continuousClock) var clock @Dependency(\.mainQueue) var mainQueue - private struct CancelID: Hashable { let category: MusicSeason } - private struct HomeCancel: Hashable {} + private enum CancelID: Hashable { + case fetchAll + case season(MusicSeason) + } public var body: some Reducer { BindingReducer() @@ -104,6 +108,8 @@ extension HomeReducer { ) -> Effect { switch action { case .onAppear: + guard state.didTriggerInitialFetch == false else { return .none } + state.didTriggerInitialFetch = true return .send(.async(.fetchAll)) } } @@ -114,10 +120,19 @@ extension HomeReducer { ) -> Effect { switch action { case .fetchAll: - return .merge( - MusicSeason.allCases.map { .send(.async(.fetchMusic($0))) } - ) - .debounce(id: HomeCancel(), for: 0.1, scheduler: mainQueue) + return .run { [musicSearchUseCase] send in + await withTaskGroup(of: Void.self) { group in + for season in MusicSeason.allCases { + group.addTask { + let result = await Result { + try await musicSearchUseCase.searchMusic(searchQuery: season.term) + } + await send(.inner(.fetchMusicResponse(season, result))) + } + } + } + } + .cancellable(id: CancelID.fetchAll, cancelInFlight: true) case .fetchMusic(let category): return .run { send in @@ -131,7 +146,7 @@ extension HomeReducer { await send(.inner(.fetchMusicResponse(category, .failure(error)))) } } - .cancellable(id: CancelID(category: category), cancelInFlight: true) + .cancellable(id: CancelID.season(category), cancelInFlight: true) } } @@ -143,6 +158,9 @@ extension HomeReducer { case .musicCardTapped(let item): state.$detailMusicItem.withLock { $0 = item } return .none + + case .tapSearch: + return .none } } diff --git a/Projects/Presentation/Home/Sources/Main /View/Component/SearchBarView.swift b/Projects/Presentation/Home/Sources/Main /View/Component/SearchBarView.swift index 0206343..7490448 100644 --- a/Projects/Presentation/Home/Sources/Main /View/Component/SearchBarView.swift +++ b/Projects/Presentation/Home/Sources/Main /View/Component/SearchBarView.swift @@ -2,7 +2,13 @@ import SwiftUI import DesignSystem public struct SearchBarView: View { - public init() {} + private var action: () -> Void = { } + + public init( + action: @escaping () -> Void + ) { + self.action = action + } public var body: some View { HStack(spacing: 10) { @@ -27,6 +33,7 @@ public struct SearchBarView: View { ) .shadow(color: .black.opacity(0.2), radius: 3, y: 2) ) - .contentShape(Rectangle()) + .contentShape(Rectangle()) + .onTapGesture(perform: action) } } diff --git a/Projects/Presentation/Home/Sources/Main /View/HomeView.swift b/Projects/Presentation/Home/Sources/Main /View/HomeView.swift index 9356623..cad6cfb 100644 --- a/Projects/Presentation/Home/Sources/Main /View/HomeView.swift +++ b/Projects/Presentation/Home/Sources/Main /View/HomeView.swift @@ -23,7 +23,6 @@ public struct HomeView: View { GeometryReader { proxy in WithPerceptionTracking { let horizontalPadding: CGFloat = 20 - let contentWidth = max(proxy.size.width - (horizontalPadding * 2), 0) let cardHeight: CGFloat = 200 let searchBarHeight: CGFloat = 68 @@ -59,7 +58,9 @@ public struct HomeView: View { .scrollIndicators(.hidden) VStack(spacing: 8) { - SearchBarView() + SearchBarView { + store.send(.navigation(.tapSearch)) + } .padding(.horizontal, horizontalPadding) } .padding(.top, proxy.safeAreaInsets.top + 4) diff --git a/Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj b/Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj index 9098f7d..f2ba27e 100644 --- a/Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj +++ b/Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj @@ -13,9 +13,7 @@ 0472B25152FBED636F44CD68 /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D991D25F496F0B57F3200941 /* API.framework */; }; 097514984C09DCD1D4856511 /* IssueReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7591663F2D1B24C4BDA756A /* IssueReporting.framework */; }; 0ED96C609E3A38826EC31884 /* swift-sharing_Sharing.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 32DB353133F1D17C0F625336 /* swift-sharing_Sharing.bundle */; }; - 10BFCBDE3F3DA3E08F06E2E1 /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D8A7AC209392899E86BB7CDB /* Home.framework */; }; 134DFAA45EFD85BD6F35CF41 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DF67A808CE2A8F674F38CD60 /* CombineMoya.framework */; }; - 14DAD3FC298095990C5B1E92 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6D7B094FAAB5DF45209E0919 /* Detail.framework */; }; 16AA1EF839323DCCE84D0BE2 /* SwiftNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43B4D42BC4DDD8A43DF9671C /* SwiftNavigation.framework */; }; 1723EC00298B5AC8D3262760 /* Detail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D7B094FAAB5DF45209E0919 /* Detail.framework */; }; 1EAAF94C2DBE6792F3DC10F0 /* UIKitNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85E19ADD14C9C9B66429933E /* UIKitNavigation.framework */; }; @@ -27,14 +25,15 @@ 301576D6C257658B1D6B2F62 /* IssueReportingPackageSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB19892F3BF3A5908473514F /* IssueReportingPackageSupport.framework */; }; 315228127069BB806DAE9F24 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DED236801C3C6EBF9BB755A4 /* Shared.framework */; }; 353B901CF762F68E86363491 /* UseCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 868F9D0352A18E88B6F78CDE /* UseCase.framework */; }; - 3EFAE440F52C82155605ECEA /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D8A7AC209392899E86BB7CDB /* Home.framework */; }; 461B7923C5885A691102455A /* IdentifiedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F03CD23882DA025CC86817 /* IdentifiedCollections.framework */; }; 49F6D986954C901DC50E5A49 /* Sharing1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 232AE6BF7A1AFCF0B9B823FD /* Sharing1.framework */; }; + 4A1C3E825C8B1034E7E8218B /* RootTab.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 874222D75AC3294956D882B5 /* RootTab.framework */; }; 4E660B1501EE176BAAEAEA27 /* PresentationExported.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C60918107A83F4DDE9D417D /* PresentationExported.swift */; }; 5248ACB941821BF3F91EA6D7 /* Dependencies.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DB201D0E8BE1D1547639F88 /* Dependencies.framework */; }; - 54B649D24AB621D8E9044D06 /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D8A7AC209392899E86BB7CDB /* Home.framework */; }; 56FCE4DA807E3179DEFAF470 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3E14D09AE76BE920545555A /* Core.framework */; }; 59F11625F203DCDD137E6944 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0595BAB78E7CD48075AF15B0 /* Model.framework */; }; + 5AC827149AD48A6F79CF63DA /* Search.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BBD8EA71D55024889942740 /* Search.framework */; }; + 604FFFA110A0274CEF369B5B /* RootTab.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 874222D75AC3294956D882B5 /* RootTab.framework */; }; 610E66B1C269EBC709E677F2 /* swift-sharing_Sharing.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 32DB353133F1D17C0F625336 /* swift-sharing_Sharing.bundle */; }; 6596CD1618805254CB7F40D2 /* PerceptionCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBD6E248067073EB598B6D86 /* PerceptionCore.framework */; }; 69F501FFCECF1AB16A4D4752 /* Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 342AE4EAEE40294F0A26F2B8 /* Presentation.framework */; }; @@ -55,28 +54,27 @@ 9817995B59A87456AC4FAFBE /* Perception.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2C1426AC84D7DD283CE6A67 /* Perception.framework */; }; 996AEC4FE0BFF1A9467213F1 /* Clocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74DA26FE7C09459795F68303 /* Clocks.framework */; }; 99ED14160CCB43FDE651C307 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EBF73C9599C25FE868248ED /* Test.swift */; }; + A2595F3FD6455F83F16AE242 /* RootTab.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 874222D75AC3294956D882B5 /* RootTab.framework */; }; A61EBC1D0EBE7174C206C498 /* CombineSchedulers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F9691EC204490112CA94915 /* CombineSchedulers.framework */; }; A86F784BF54F7B2E520F174C /* UIKitNavigationShim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20933EA2BA8C344219E3B1FD /* UIKitNavigationShim.framework */; }; ABF8F449B19C3462BD42A592 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D35546BA6932409F8FF5020 /* RxMoya.framework */; }; AC907DAE5D69D2EBF4A6262A /* SwiftUINavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F0A130F086322D137AF4BA1 /* SwiftUINavigation.framework */; }; B0696BD15C1FDD2C15F7CE55 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = F654B06F3CC69CB66B70DDA8 /* Alamofire_Alamofire.bundle */; }; B2A93C61D0DC6E629714EAF9 /* InternalCollectionsUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C2D55F688109111CA472A53 /* InternalCollectionsUtilities.framework */; }; - B584B787DA06633F36954C60 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6D7B094FAAB5DF45209E0919 /* Detail.framework */; }; + B90D4D7A6C574EEA6D6BAF9B /* RootTab.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 874222D75AC3294956D882B5 /* RootTab.framework */; }; C28B1DD196DC96F555D940F6 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 4C470EB5F1E10C6ED803FB18 /* swift-composable-architecture_ComposableArchitecture.bundle */; }; C7A0C7EBE0FDA649B2B3CEA3 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66443C80B20B08C1363E951B /* LogMacro.framework */; }; CA1F1BC4BC46F2F7457CA223 /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40385C989FA3C085C6B32CBD /* EventLimiter.framework */; }; + CA320E6552FC7E6B1804DE26 /* RootTab.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 874222D75AC3294956D882B5 /* RootTab.framework */; }; + CBA793D6F6865D71B7E67AEE /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1434E7715232F6B9E9539F61 /* NetworkService.framework */; }; CF2FD6EA7BDF7A79A3D44A02 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CFA78759AF8280F2478F2F44 /* RxSwift.framework */; }; D6937F780910962C215A4384 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5124FBC8C2F9742036F58585 /* CFNetwork.framework */; }; - DBDF5AD2B4E0C7B00CDBED24 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6D7B094FAAB5DF45209E0919 /* Detail.framework */; }; DFC54C97C8A9A36AF01B9888 /* Splash.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CFAF6F16A6A28289BDF6762 /* Splash.framework */; }; - DFF831C7D749689730C26A6C /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = D8A7AC209392899E86BB7CDB /* Home.framework */; }; - E7CBAEF8338E806EEA5F4FDC /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 6D7B094FAAB5DF45209E0919 /* Detail.framework */; }; E85F7B48B6FB8E385AD94FBD /* DataInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E26D9853EBB0199194461471 /* DataInterface.framework */; }; E981CFD6DC1F1C9534C9E167 /* PresentationExported.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C60918107A83F4DDE9D417D /* PresentationExported.swift */; }; EC2D67DCAC8BF67040034401 /* Splash.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 5CFAF6F16A6A28289BDF6762 /* Splash.framework */; }; EC45B7902635A0D6998CDF65 /* Home.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8A7AC209392899E86BB7CDB /* Home.framework */; }; EEE4922049DE831695B18E79 /* XCTestDynamicOverlay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 375AA2720EF90234325320FB /* XCTestDynamicOverlay.framework */; }; - EF37DF3F1678952A881FE872 /* Service.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF3D9435F3E4322BD6B9160E /* Service.framework */; }; F09DA4847204EF87C7B58C84 /* Sharing2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6748D289DD7DC16E86016069 /* Sharing2.framework */; }; F650CC620116BE8B2F36DE6C /* DependenciesMacros.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC62388B726211C6EB4E61FE /* DependenciesMacros.framework */; }; FD0F32BCA77F5C66B4BB6F47 /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49CD2C5E60DF7C88EAF411D6 /* Moya.framework */; }; @@ -108,8 +106,7 @@ buildActionMask = 8; dstSubfolderSpec = 16; files = ( - 14DAD3FC298095990C5B1E92 /* Detail.framework in Dependencies */, - 3EFAE440F52C82155605ECEA /* Home.framework in Dependencies */, + 604FFFA110A0274CEF369B5B /* RootTab.framework in Dependencies */, EC2D67DCAC8BF67040034401 /* Splash.framework in Dependencies */, ); name = Dependencies; @@ -120,8 +117,7 @@ buildActionMask = 8; dstSubfolderSpec = 16; files = ( - B584B787DA06633F36954C60 /* Detail.framework in Dependencies */, - 54B649D24AB621D8E9044D06 /* Home.framework in Dependencies */, + A2595F3FD6455F83F16AE242 /* RootTab.framework in Dependencies */, 2E51D64D30DF720ED92D75D5 /* Splash.framework in Dependencies */, ); name = Dependencies; @@ -132,8 +128,7 @@ buildActionMask = 8; dstSubfolderSpec = 16; files = ( - E7CBAEF8338E806EEA5F4FDC /* Detail.framework in Dependencies */, - DFF831C7D749689730C26A6C /* Home.framework in Dependencies */, + B90D4D7A6C574EEA6D6BAF9B /* RootTab.framework in Dependencies */, 7685A7198512E2DA052B2C07 /* Splash.framework in Dependencies */, ); name = Dependencies; @@ -164,8 +159,7 @@ buildActionMask = 8; dstSubfolderSpec = 16; files = ( - DBDF5AD2B4E0C7B00CDBED24 /* Detail.framework in Dependencies */, - 10BFCBDE3F3DA3E08F06E2E1 /* Home.framework in Dependencies */, + 4A1C3E825C8B1034E7E8218B /* RootTab.framework in Dependencies */, 038F4E4797CB365217FCCBF9 /* Splash.framework in Dependencies */, ); name = Dependencies; @@ -211,6 +205,7 @@ 0C8972F6F03E2BD077DCB37E /* CustomDump.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CustomDump.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0E53C9395F99DBE02DF9D55F /* WeaveDI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WeaveDI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 134AEE009D928C7E39EAF4CD /* Presentation-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Presentation-Info.plist"; sourceTree = ""; }; + 1434E7715232F6B9E9539F61 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1BBE3CACD554CD19E4299A9F /* ComposableArchitecture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ComposableArchitecture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1D35546BA6932409F8FF5020 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1F0A130F086322D137AF4BA1 /* SwiftUINavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftUINavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -223,6 +218,7 @@ 32DB353133F1D17C0F625336 /* swift-sharing_Sharing.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-sharing_Sharing.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 342AE4EAEE40294F0A26F2B8 /* Presentation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Presentation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 375AA2720EF90234325320FB /* XCTestDynamicOverlay.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XCTestDynamicOverlay.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3BBD8EA71D55024889942740 /* Search.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3C60918107A83F4DDE9D417D /* PresentationExported.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationExported.swift; sourceTree = ""; }; 3EBF73C9599C25FE868248ED /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; 40385C989FA3C085C6B32CBD /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -241,6 +237,7 @@ 74DA26FE7C09459795F68303 /* Clocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Clocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 85E19ADD14C9C9B66429933E /* UIKitNavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UIKitNavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 868F9D0352A18E88B6F78CDE /* UseCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UseCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 874222D75AC3294956D882B5 /* RootTab.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RootTab.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8DB201D0E8BE1D1547639F88 /* Dependencies.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Dependencies.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 984C2842981AA76BB051604E /* Repository.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Repository.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9C4E2C9101CD2ABA7FC93366 /* CasePaths.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CasePaths.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -254,7 +251,6 @@ C3C8E6B260438991CE9B6F0E /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C3E14D09AE76BE920545555A /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CB19892F3BF3A5908473514F /* IssueReportingPackageSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReportingPackageSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CF3D9435F3E4322BD6B9160E /* Service.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Service.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CFA78759AF8280F2478F2F44 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D29941E89A40C785D8930DE4 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D2F03CD23882DA025CC86817 /* IdentifiedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IdentifiedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -313,15 +309,17 @@ C7A0C7EBE0FDA649B2B3CEA3 /* LogMacro.framework in Frameworks */, 59F11625F203DCDD137E6944 /* Model.framework in Frameworks */, FD0F32BCA77F5C66B4BB6F47 /* Moya.framework in Frameworks */, + CBA793D6F6865D71B7E67AEE /* NetworkService.framework in Frameworks */, 7BF75B96B35D343D12F1E55F /* Networking.framework in Frameworks */, 2C6CAA8DB03549419C9A3E0C /* OrderedCollections.framework in Frameworks */, 9817995B59A87456AC4FAFBE /* Perception.framework in Frameworks */, 6596CD1618805254CB7F40D2 /* PerceptionCore.framework in Frameworks */, 69F501FFCECF1AB16A4D4752 /* Presentation.framework in Frameworks */, 03AACEC517F47A8E595AB9AF /* Repository.framework in Frameworks */, + CA320E6552FC7E6B1804DE26 /* RootTab.framework in Frameworks */, ABF8F449B19C3462BD42A592 /* RxMoya.framework in Frameworks */, CF2FD6EA7BDF7A79A3D44A02 /* RxSwift.framework in Frameworks */, - EF37DF3F1678952A881FE872 /* Service.framework in Frameworks */, + 5AC827149AD48A6F79CF63DA /* Search.framework in Frameworks */, 315228127069BB806DAE9F24 /* Shared.framework in Frameworks */, 8D23DE0BD5A9E91111F24602 /* Sharing.framework in Frameworks */, 49F6D986954C901DC50E5A49 /* Sharing1.framework in Frameworks */, @@ -455,6 +453,7 @@ 0595BAB78E7CD48075AF15B0 /* Model.framework */, 49CD2C5E60DF7C88EAF411D6 /* Moya.framework */, D663ED1986448AD4662C5624 /* Networking.framework */, + 1434E7715232F6B9E9539F61 /* NetworkService.framework */, A5B2D2882714ECB08228A5F1 /* OrderedCollections.framework */, B2C1426AC84D7DD283CE6A67 /* Perception.framework */, DBD6E248067073EB598B6D86 /* PerceptionCore.framework */, @@ -464,9 +463,10 @@ 342AE4EAEE40294F0A26F2B8 /* Presentation.framework */, B5F6E2479E03DF9A1548AFE4 /* PresentationTests.xctest */, 984C2842981AA76BB051604E /* Repository.framework */, + 874222D75AC3294956D882B5 /* RootTab.framework */, 1D35546BA6932409F8FF5020 /* RxMoya.framework */, CFA78759AF8280F2478F2F44 /* RxSwift.framework */, - CF3D9435F3E4322BD6B9160E /* Service.framework */, + 3BBD8EA71D55024889942740 /* Search.framework */, DED236801C3C6EBF9BB755A4 /* Shared.framework */, 497184139D240D91EF50C77C /* Sharing.framework */, 232AE6BF7A1AFCF0B9B823FD /* Sharing1.framework */, diff --git a/Projects/Presentation/Presentation/Project.swift b/Projects/Presentation/Presentation/Project.swift index 6abc185..0655422 100644 --- a/Projects/Presentation/Presentation/Project.swift +++ b/Projects/Presentation/Presentation/Project.swift @@ -11,8 +11,7 @@ let project = Project.makeAppModule( settings: .settings(), dependencies: [ .Presentation(implements: .Splash), - .Presentation(implements: .Home), - .Presentation(implements: .Detail) + .Presentation(implements: .RootTab) ], sources: ["Sources/**"] ) diff --git a/Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift b/Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift index 24a95a8..8e05e12 100644 --- a/Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift +++ b/Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift @@ -10,3 +10,5 @@ @_exported import Splash @_exported import Home @_exported import Detail +@_exported import Search +@_exported import RootTab diff --git a/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Debug-Info.plist b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Debug-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Debug-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Info.plist b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Prod-Info.plist b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Prod-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Prod-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Stage-Info.plist b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Stage-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTab-Stage-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/RootTab/Derived/InfoPlists/RootTabTests-Info.plist b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTabTests-Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/Projects/Presentation/RootTab/Derived/InfoPlists/RootTabTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/RootTab/Project.swift b/Projects/Presentation/RootTab/Project.swift new file mode 100644 index 0000000..7c68148 --- /dev/null +++ b/Projects/Presentation/RootTab/Project.swift @@ -0,0 +1,18 @@ +import Foundation +import ProjectDescription +import DependencyPlugin +import ProjectTemplatePlugin +import ProjectTemplatePlugin +import DependencyPackagePlugin + +let project = Project.makeAppModule( + name: "RootTab", + bundleId: .appBundleID(name: ".RootTab"), + product: .staticFramework, + settings: .settings(), + dependencies: [ + .Presentation(implements: .Home), + .Presentation(implements: .Search), + ], + sources: ["Sources/**"] +) diff --git a/Projects/Presentation/RootTab/RootTab.xcodeproj/project.pbxproj b/Projects/Presentation/RootTab/RootTab.xcodeproj/project.pbxproj new file mode 100644 index 0000000..0c68918 --- /dev/null +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/project.pbxproj @@ -0,0 +1,1563 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 01BD92F9D6F7E47ED5BA50ED /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F8130BE2C4326E7BC2427CA2 /* Home.framework */; }; + 020C31A3A43113E63D594236 /* SwiftNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21290B6BFDDAEDB8E29DABEB /* SwiftNavigation.framework */; }; + 090CA66016B821DB0F408C01 /* XCTestDynamicOverlay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF650514C2BEB59DA6183832 /* XCTestDynamicOverlay.framework */; }; + 09487B73F535836C31F8F8A2 /* CombineMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B1CE74716178CFF38931D4 /* CombineMoya.framework */; }; + 0BE8FFE039BA9FBDCD637844 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED8024A56BBE55D636D7720 /* Test.swift */; }; + 0CF1C8B7E326DEC93B1D5659 /* Search.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */; }; + 1408DE0EFE1AF744372711F2 /* WeaveDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 029F1A2624AF00C024047375 /* WeaveDI.framework */; }; + 1491281FDA3AF802E65F6804 /* RxMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68CB45E1582E9F8F0CFCB2E1 /* RxMoya.framework */; }; + 1DEC22BB3F6BAC269EB0254A /* Home.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8130BE2C4326E7BC2427CA2 /* Home.framework */; }; + 1F8A1C0AA494631787315002 /* InternalCollectionsUtilities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCEEE51ACD7CEB6AC11EC36C /* InternalCollectionsUtilities.framework */; }; + 23824011C238C1B4C380BE7C /* CustomDump.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7404339BA365E49E4EEF02FB /* CustomDump.framework */; }; + 26F57E5BB38A9BD230E5E067 /* NetworkService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C5B9ED8AF81AD77FD0BEB32 /* NetworkService.framework */; }; + 2C5362973E2B59041DBC629E /* Detail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D9BCB85FAD54897B8DDE8B /* Detail.framework */; }; + 2C9706443F494184DAF86E13 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F25A3677F3DADBF9B5D9E35 /* Core.framework */; }; + 2EDAB4F665FE1D59D68E6272 /* swift-sharing_Sharing.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 513D11EBC521663F8B0ED08B /* swift-sharing_Sharing.bundle */; }; + 35E346199A87761D6630779F /* RootTab.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E85D726FFB83324402F614D /* RootTab.framework */; }; + 3631562AC8B6F6B6B35BC643 /* EventLimiter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6772D78A667A6FCCC236C6A /* EventLimiter.framework */; }; + 3A1BC21C4119A100E2719935 /* MainTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CCD8ADD86F538F33A41F /* MainTab.swift */; }; + 3ABF8CD6D53C0E7939726CCF /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F8130BE2C4326E7BC2427CA2 /* Home.framework */; }; + 3F52C072B75B412383250670 /* CombineSchedulers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3A3420B7BDFC732BD47BF8E /* CombineSchedulers.framework */; }; + 42102D63F0DF5FB5D284AA51 /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F8130BE2C4326E7BC2427CA2 /* Home.framework */; }; + 4822BD22E5924A5E5208838D /* MainTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CCD8ADD86F538F33A41F /* MainTab.swift */; }; + 49B924DC9452A26B19423AD6 /* SwiftUINavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0455A99419CDC6EB61F00806 /* SwiftUINavigation.framework */; }; + 4B1D510CE71A35D4AB7F1273 /* CasePaths.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E602F268785B12CED6C97871 /* CasePaths.framework */; }; + 4D051A20411E680969E31A7B /* DataInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9727F4DC6B08A8AB31CBB513 /* DataInterface.framework */; }; + 4E6602DF02349D4F05A0B2F3 /* ConcurrencyExtras.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87F900E3D284BAF13B708B05 /* ConcurrencyExtras.framework */; }; + 5F299A3C1A449D23ECECF49E /* IssueReporting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D624A36A172644E61089C01C /* IssueReporting.framework */; }; + 628B95CC4312246B8F2CF3D0 /* OSLog.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 306C0DC2E10133AE3E3D036C /* OSLog.framework */; }; + 63D241F349C2D13132A5D080 /* LogMacro.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB0DCAECA21A97CA89433C0A /* LogMacro.framework */; }; + 6B9ED905C5325610C0727B8D /* RootTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */; }; + 6C493B51DE6802C118D40B71 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F21D37FBB009BC838E8D1561 /* Shared.framework */; }; + 6C5D019282D45746BED8DAF7 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F07ACFA612759EA805148EB /* Alamofire.framework */; }; + 6CBC3B611AAEB2E70F9309E8 /* Dependencies.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE50812D010FBE676BAC4E5A /* Dependencies.framework */; }; + 6E13886EA9D41ED6C77FA77C /* Perception.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F25AD8B4EEDAC2332E15E93 /* Perception.framework */; }; + 71ACA02815907A2EBDA1470C /* Moya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88FE3677C3610371E1170004 /* Moya.framework */; }; + 7552207B4A9E60635876F8C0 /* Search.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */; }; + 7828F1ABA4FF47C55DE4BE16 /* RootTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */; }; + 791830F2196ED80D1F8AA9C7 /* IdentifiedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B165818173DF92988B51E88 /* IdentifiedCollections.framework */; }; + 797C0AD5563B8FBD2DF0E961 /* Sharing2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AC4945177993F780482E796 /* Sharing2.framework */; }; + 7A7D498E23E7964B36EA374B /* Search.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */; }; + 82A10834C77F64DCE61F5D56 /* Foundations.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E1C0151448BD0DAA9D776B2 /* Foundations.framework */; }; + 87D15823F6A0FC4A16FA6322 /* UseCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E4568F41C95DE2CF031AD82 /* UseCase.framework */; }; + 8A2B6F00A071719CFC6CA0B0 /* OrderedCollections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DF07BBEC2B8DEDC4C260EE3 /* OrderedCollections.framework */; }; + 8A8ED2930876C172F905A3D0 /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = A1C16254E7FD6C06998DBE42 /* Alamofire_Alamofire.bundle */; }; + 8D801CE7E62B817D8ACC9CB0 /* Search.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */; }; + 9230D430FAC14885BF777637 /* ComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EBF021CF00A46FD1CDE413 /* ComposableArchitecture.framework */; }; + 92905DD7230F342FA0CC01F1 /* Model.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBBC1F55BDCC1315B9087973 /* Model.framework */; }; + 9671C59CA3745DA7E1BEFF47 /* AsyncMoya.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 929FB8C9C74AB168701FA901 /* AsyncMoya.framework */; }; + 99FE16348C98C22F6A64EF94 /* RootTabReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */; }; + 9AB1FE8773340BB4C559140C /* Repository.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E4B88860DA7B41658B863F5 /* Repository.framework */; }; + 9B687D9CA6F2A4D8D9654CE7 /* MainTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CCD8ADD86F538F33A41F /* MainTab.swift */; }; + 9F8B97B641CA6855F1C7573D /* RootTabReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */; }; + A01C41F3F19E71806135957C /* Sharing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CAE284E7D53D427482FC3AA /* Sharing.framework */; }; + B0EAB4B461F7B51E03915C90 /* swift-sharing_Sharing.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 513D11EBC521663F8B0ED08B /* swift-sharing_Sharing.bundle */; }; + B2BD499036CBB401F0C811A5 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFA308FEF6AE6BECD015ABAA /* CFNetwork.framework */; }; + B5315E7F2312D555D7FF5A23 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 56E09369F4C9A91174D69228 /* swift-composable-architecture_ComposableArchitecture.bundle */; }; + B60FE16E9E2E8A1AF0A842AE /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E58A732CBA14DB658B627F9 /* DomainInterface.framework */; }; + B77247FA01EED95B6695106E /* API.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6035808A0B713776BCA70ADF /* API.framework */; }; + B7EF4AA34762893F97C713BC /* PerceptionCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA9632F0C162504B354411BA /* PerceptionCore.framework */; }; + B963575E9AA30F41305EFF04 /* DependenciesMacros.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B253ABA2FF5167C9F185397 /* DependenciesMacros.framework */; }; + BB29B52EFA2DAFF460CC4D6C /* MainTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CCD8ADD86F538F33A41F /* MainTab.swift */; }; + BB3BEB308A57E7A68556B7AD /* RootTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */; }; + BE5F43930A66A57C2875F2F2 /* swift-composable-architecture_ComposableArchitecture.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 56E09369F4C9A91174D69228 /* swift-composable-architecture_ComposableArchitecture.bundle */; }; + C073C740B313BDB02B450FE1 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A1C16254E7FD6C06998DBE42 /* Alamofire_Alamofire.bundle */; }; + C5931ADEA838DBDAF5A35F02 /* Home.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = F8130BE2C4326E7BC2427CA2 /* Home.framework */; }; + CC9A88E1F02A28AFECB6F664 /* RootTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */; }; + CF779C0A6F3A369F10B7BAD1 /* UIKitNavigation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FDDED00488067E78E755A8F /* UIKitNavigation.framework */; }; + D42435FA343605CA97165039 /* Search.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */; }; + D6AE4C876709391C1397A7AD /* CasePathsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5874816DFC13AA9A3FB9AA89 /* CasePathsCore.framework */; }; + DEAC09F99821BA5E1D374859 /* UIKitNavigationShim.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C784BE51019B23768C0561E0 /* UIKitNavigationShim.framework */; }; + DF3A47E716C7381FB3C82FF6 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2316853B90E5B192180FED43 /* RxSwift.framework */; }; + E7C4DDCA2D6E0EE630A80A67 /* Clocks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18CA94EE0ACCDAAF7ECCA458 /* Clocks.framework */; }; + EAA37A8EC9BD55AFE992D0EC /* IssueReportingPackageSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBFD412FBBF9EB6E0025B260 /* IssueReportingPackageSupport.framework */; }; + EC55F38FB6CF1045C8D96489 /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C31694C387837622262B91 /* Networking.framework */; }; + EF3D86368E65E910E54C5D17 /* RootTabReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */; }; + F1C3EFAB5F9ADF31A182097B /* RootTabReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */; }; + F5A9D18773F6730C83A98BD4 /* Sharing1.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED64B320ED1FA03A8436CB4A /* Sharing1.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9F55CFF021AF851B8FDFE053 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29BC1D722E4096C9E46AB722 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A57DF7FAED265CC780DD5AEE; + remoteInfo = RootTab; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1E7C8290BB6444594606C932 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 409F181E69A4B0E845844D4A /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 699BF4F3CAF1CCEF0A9963CD /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + C5931ADEA838DBDAF5A35F02 /* Home.framework in Dependencies */, + 8D801CE7E62B817D8ACC9CB0 /* Search.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 6D34138EE56F9A0FBDE1975E /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 3ABF8CD6D53C0E7939726CCF /* Home.framework in Dependencies */, + 0CF1C8B7E326DEC93B1D5659 /* Search.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 84D519DFCB160BEC175355D0 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 8C56AE43B59108128A0EA423 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 01BD92F9D6F7E47ED5BA50ED /* Home.framework in Dependencies */, + 7A7D498E23E7964B36EA374B /* Search.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 9BD79EB7BDAAE9ECD9FCDFCA /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 8A8ED2930876C172F905A3D0 /* Alamofire_Alamofire.bundle in Dependencies */, + BE5F43930A66A57C2875F2F2 /* swift-composable-architecture_ComposableArchitecture.bundle in Dependencies */, + B0EAB4B461F7B51E03915C90 /* swift-sharing_Sharing.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 9E2042A6CE82AD3A2311ADDE /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 42102D63F0DF5FB5D284AA51 /* Home.framework in Dependencies */, + 7552207B4A9E60635876F8C0 /* Search.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + DB771459623AEB5BE9C413FB /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + FC042CB35C00E28F6CF16BE5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 029F1A2624AF00C024047375 /* WeaveDI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WeaveDI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0455A99419CDC6EB61F00806 /* SwiftUINavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftUINavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0AC4945177993F780482E796 /* Sharing2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sharing2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0C5B9ED8AF81AD77FD0BEB32 /* NetworkService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NetworkService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0CAE284E7D53D427482FC3AA /* Sharing.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sharing.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 18CA94EE0ACCDAAF7ECCA458 /* Clocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Clocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FDDED00488067E78E755A8F /* UIKitNavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UIKitNavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 21290B6BFDDAEDB8E29DABEB /* SwiftNavigation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftNavigation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2316853B90E5B192180FED43 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E4B88860DA7B41658B863F5 /* Repository.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Repository.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 306C0DC2E10133AE3E3D036C /* OSLog.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OSLog.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OSLog.framework; sourceTree = DEVELOPER_DIR; }; + 3E85D726FFB83324402F614D /* RootTab.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RootTab.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4116724BFD665612C48F13C2 /* RootTab_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RootTab_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 42DCC593E8E4EF3777E4243E /* RootTabTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RootTabTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F25A3677F3DADBF9B5D9E35 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 513D11EBC521663F8B0ED08B /* swift-sharing_Sharing.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-sharing_Sharing.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + 56E09369F4C9A91174D69228 /* swift-composable-architecture_ComposableArchitecture.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-composable-architecture_ComposableArchitecture.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5874816DFC13AA9A3FB9AA89 /* CasePathsCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CasePathsCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5C35CCD8ADD86F538F33A41F /* MainTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTab.swift; sourceTree = ""; }; + 6035808A0B713776BCA70ADF /* API.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = API.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 68CB45E1582E9F8F0CFCB2E1 /* RxMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 69B1CE74716178CFF38931D4 /* CombineMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B165818173DF92988B51E88 /* IdentifiedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IdentifiedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B253ABA2FF5167C9F185397 /* DependenciesMacros.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DependenciesMacros.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7404339BA365E49E4EEF02FB /* CustomDump.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CustomDump.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 82120579B3AD3781A7A59786 /* RootTab-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RootTab-Info.plist"; sourceTree = ""; }; + 87F900E3D284BAF13B708B05 /* ConcurrencyExtras.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ConcurrencyExtras.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 88FE3677C3610371E1170004 /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8E4568F41C95DE2CF031AD82 /* UseCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UseCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F07ACFA612759EA805148EB /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 929FB8C9C74AB168701FA901 /* AsyncMoya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncMoya.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 95EBF021CF00A46FD1CDE413 /* ComposableArchitecture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ComposableArchitecture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9727F4DC6B08A8AB31CBB513 /* DataInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DataInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 98D9BCB85FAD54897B8DDE8B /* Detail.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Detail.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9DF07BBEC2B8DEDC4C260EE3 /* OrderedCollections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedCollections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9E1C0151448BD0DAA9D776B2 /* Foundations.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Foundations.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9E58A732CBA14DB658B627F9 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9EFA165EE8191A56CFE665C8 /* RootTab-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RootTab-Prod-Info.plist"; sourceTree = ""; }; + 9F25AD8B4EEDAC2332E15E93 /* Perception.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Perception.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A1C16254E7FD6C06998DBE42 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + A6772D78A667A6FCCC236C6A /* EventLimiter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = EventLimiter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AE50812D010FBE676BAC4E5A /* Dependencies.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Dependencies.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF2A2E6241A5A45BB177C029 /* RootTab_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RootTab_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3A3420B7BDFC732BD47BF8E /* CombineSchedulers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CombineSchedulers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3BA2FAA745DD13973199F1D /* RootTab_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RootTab_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BB0DCAECA21A97CA89433C0A /* LogMacro.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LogMacro.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBBC1F55BDCC1315B9087973 /* Model.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Model.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BF9FA9EB01ED131B20DAA8A3 /* RootTab-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RootTab-Stage-Info.plist"; sourceTree = ""; }; + BFA308FEF6AE6BECD015ABAA /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + C784BE51019B23768C0561E0 /* UIKitNavigationShim.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = UIKitNavigationShim.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootTabBarView.swift; sourceTree = ""; }; + D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootTabReducer.swift; sourceTree = ""; }; + D624A36A172644E61089C01C /* IssueReporting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReporting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E5008368936CF01B25701BE3 /* RootTabTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RootTabTests-Info.plist"; sourceTree = ""; }; + E602F268785B12CED6C97871 /* CasePaths.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CasePaths.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA9632F0C162504B354411BA /* PerceptionCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PerceptionCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EBFD412FBBF9EB6E0025B260 /* IssueReportingPackageSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IssueReportingPackageSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ED64B320ED1FA03A8436CB4A /* Sharing1.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Sharing1.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F21D37FBB009BC838E8D1561 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F8130BE2C4326E7BC2427CA2 /* Home.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Home.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F9C31694C387837622262B91 /* Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FCEEE51ACD7CEB6AC11EC36C /* InternalCollectionsUtilities.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = InternalCollectionsUtilities.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FE2D88CE715CA7CF0633442C /* RootTab-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "RootTab-Debug-Info.plist"; sourceTree = ""; }; + FED8024A56BBE55D636D7720 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = ""; }; + FF650514C2BEB59DA6183832 /* XCTestDynamicOverlay.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XCTestDynamicOverlay.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 66D9F9A6D2BD15457FCD140A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6BA9D57C48E8EB7DC5365F7C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0FE98E48B3F272EBAF199CF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B5BAA54684571E711CDB6A32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B2BD499036CBB401F0C811A5 /* CFNetwork.framework in Frameworks */, + 628B95CC4312246B8F2CF3D0 /* OSLog.framework in Frameworks */, + B77247FA01EED95B6695106E /* API.framework in Frameworks */, + 6C5D019282D45746BED8DAF7 /* Alamofire.framework in Frameworks */, + 9671C59CA3745DA7E1BEFF47 /* AsyncMoya.framework in Frameworks */, + 4B1D510CE71A35D4AB7F1273 /* CasePaths.framework in Frameworks */, + D6AE4C876709391C1397A7AD /* CasePathsCore.framework in Frameworks */, + E7C4DDCA2D6E0EE630A80A67 /* Clocks.framework in Frameworks */, + 09487B73F535836C31F8F8A2 /* CombineMoya.framework in Frameworks */, + 3F52C072B75B412383250670 /* CombineSchedulers.framework in Frameworks */, + 9230D430FAC14885BF777637 /* ComposableArchitecture.framework in Frameworks */, + 4E6602DF02349D4F05A0B2F3 /* ConcurrencyExtras.framework in Frameworks */, + 2C9706443F494184DAF86E13 /* Core.framework in Frameworks */, + 23824011C238C1B4C380BE7C /* CustomDump.framework in Frameworks */, + 4D051A20411E680969E31A7B /* DataInterface.framework in Frameworks */, + 6CBC3B611AAEB2E70F9309E8 /* Dependencies.framework in Frameworks */, + B963575E9AA30F41305EFF04 /* DependenciesMacros.framework in Frameworks */, + 2C5362973E2B59041DBC629E /* Detail.framework in Frameworks */, + B60FE16E9E2E8A1AF0A842AE /* DomainInterface.framework in Frameworks */, + 3631562AC8B6F6B6B35BC643 /* EventLimiter.framework in Frameworks */, + 82A10834C77F64DCE61F5D56 /* Foundations.framework in Frameworks */, + 1DEC22BB3F6BAC269EB0254A /* Home.framework in Frameworks */, + 791830F2196ED80D1F8AA9C7 /* IdentifiedCollections.framework in Frameworks */, + 1F8A1C0AA494631787315002 /* InternalCollectionsUtilities.framework in Frameworks */, + 5F299A3C1A449D23ECECF49E /* IssueReporting.framework in Frameworks */, + EAA37A8EC9BD55AFE992D0EC /* IssueReportingPackageSupport.framework in Frameworks */, + 63D241F349C2D13132A5D080 /* LogMacro.framework in Frameworks */, + 92905DD7230F342FA0CC01F1 /* Model.framework in Frameworks */, + 71ACA02815907A2EBDA1470C /* Moya.framework in Frameworks */, + 26F57E5BB38A9BD230E5E067 /* NetworkService.framework in Frameworks */, + EC55F38FB6CF1045C8D96489 /* Networking.framework in Frameworks */, + 8A2B6F00A071719CFC6CA0B0 /* OrderedCollections.framework in Frameworks */, + 6E13886EA9D41ED6C77FA77C /* Perception.framework in Frameworks */, + B7EF4AA34762893F97C713BC /* PerceptionCore.framework in Frameworks */, + 9AB1FE8773340BB4C559140C /* Repository.framework in Frameworks */, + 35E346199A87761D6630779F /* RootTab.framework in Frameworks */, + 1491281FDA3AF802E65F6804 /* RxMoya.framework in Frameworks */, + DF3A47E716C7381FB3C82FF6 /* RxSwift.framework in Frameworks */, + D42435FA343605CA97165039 /* Search.framework in Frameworks */, + 6C493B51DE6802C118D40B71 /* Shared.framework in Frameworks */, + A01C41F3F19E71806135957C /* Sharing.framework in Frameworks */, + F5A9D18773F6730C83A98BD4 /* Sharing1.framework in Frameworks */, + 797C0AD5563B8FBD2DF0E961 /* Sharing2.framework in Frameworks */, + 020C31A3A43113E63D594236 /* SwiftNavigation.framework in Frameworks */, + 49B924DC9452A26B19423AD6 /* SwiftUINavigation.framework in Frameworks */, + CF779C0A6F3A369F10B7BAD1 /* UIKitNavigation.framework in Frameworks */, + DEAC09F99821BA5E1D374859 /* UIKitNavigationShim.framework in Frameworks */, + 87D15823F6A0FC4A16FA6322 /* UseCase.framework in Frameworks */, + 1408DE0EFE1AF744372711F2 /* WeaveDI.framework in Frameworks */, + 090CA66016B821DB0F408C01 /* XCTestDynamicOverlay.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAFCA93819ACDA1F733456A4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 06F5588336A339DD45A8416C /* Project */ = { + isa = PBXGroup; + children = ( + 65993586159DFB663FE081F9 /* Derived */, + 2B2F1FEFE0C4593D777D32D2 /* RootTabTests */, + 0FA12E712584BC878F1D688D /* Sources */, + ); + name = Project; + sourceTree = ""; + }; + 0B7A512A30456FADB463747E = { + isa = PBXGroup; + children = ( + 06F5588336A339DD45A8416C /* Project */, + 88E7052119BA92C3E4E294D2 /* Products */, + 49D96B58FD1AFE82E389DD66 /* Frameworks */, + ); + sourceTree = ""; + }; + 0FA12E712584BC878F1D688D /* Sources */ = { + isa = PBXGroup; + children = ( + 29822BB2960F2C176D2B4DDC /* Reducer */, + EF042538D859D06E04E4EBD6 /* View */, + ); + path = Sources; + sourceTree = ""; + }; + 1C9E9CCC35D31AE31E344375 /* Sources */ = { + isa = PBXGroup; + children = ( + FED8024A56BBE55D636D7720 /* Test.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 1DB1D1103E4D82074F03CD53 /* InfoPlists */ = { + isa = PBXGroup; + children = ( + FE2D88CE715CA7CF0633442C /* RootTab-Debug-Info.plist */, + 82120579B3AD3781A7A59786 /* RootTab-Info.plist */, + 9EFA165EE8191A56CFE665C8 /* RootTab-Prod-Info.plist */, + BF9FA9EB01ED131B20DAA8A3 /* RootTab-Stage-Info.plist */, + E5008368936CF01B25701BE3 /* RootTabTests-Info.plist */, + ); + path = InfoPlists; + sourceTree = ""; + }; + 29822BB2960F2C176D2B4DDC /* Reducer */ = { + isa = PBXGroup; + children = ( + 5C35CCD8ADD86F538F33A41F /* MainTab.swift */, + D22ABA16D5E5A96E9DDC17B0 /* RootTabReducer.swift */, + ); + path = Reducer; + sourceTree = ""; + }; + 2B2F1FEFE0C4593D777D32D2 /* RootTabTests */ = { + isa = PBXGroup; + children = ( + 1C9E9CCC35D31AE31E344375 /* Sources */, + ); + path = RootTabTests; + sourceTree = ""; + }; + 49D96B58FD1AFE82E389DD66 /* Frameworks */ = { + isa = PBXGroup; + children = ( + BFA308FEF6AE6BECD015ABAA /* CFNetwork.framework */, + 306C0DC2E10133AE3E3D036C /* OSLog.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 65993586159DFB663FE081F9 /* Derived */ = { + isa = PBXGroup; + children = ( + 1DB1D1103E4D82074F03CD53 /* InfoPlists */, + ); + path = Derived; + sourceTree = ""; + }; + 88E7052119BA92C3E4E294D2 /* Products */ = { + isa = PBXGroup; + children = ( + A1C16254E7FD6C06998DBE42 /* Alamofire_Alamofire.bundle */, + 8F07ACFA612759EA805148EB /* Alamofire.framework */, + 6035808A0B713776BCA70ADF /* API.framework */, + 929FB8C9C74AB168701FA901 /* AsyncMoya.framework */, + E602F268785B12CED6C97871 /* CasePaths.framework */, + 5874816DFC13AA9A3FB9AA89 /* CasePathsCore.framework */, + 18CA94EE0ACCDAAF7ECCA458 /* Clocks.framework */, + 69B1CE74716178CFF38931D4 /* CombineMoya.framework */, + B3A3420B7BDFC732BD47BF8E /* CombineSchedulers.framework */, + 95EBF021CF00A46FD1CDE413 /* ComposableArchitecture.framework */, + 87F900E3D284BAF13B708B05 /* ConcurrencyExtras.framework */, + 4F25A3677F3DADBF9B5D9E35 /* Core.framework */, + 7404339BA365E49E4EEF02FB /* CustomDump.framework */, + 9727F4DC6B08A8AB31CBB513 /* DataInterface.framework */, + AE50812D010FBE676BAC4E5A /* Dependencies.framework */, + 6B253ABA2FF5167C9F185397 /* DependenciesMacros.framework */, + 98D9BCB85FAD54897B8DDE8B /* Detail.framework */, + 9E58A732CBA14DB658B627F9 /* DomainInterface.framework */, + A6772D78A667A6FCCC236C6A /* EventLimiter.framework */, + 9E1C0151448BD0DAA9D776B2 /* Foundations.framework */, + F8130BE2C4326E7BC2427CA2 /* Home.framework */, + 6B165818173DF92988B51E88 /* IdentifiedCollections.framework */, + FCEEE51ACD7CEB6AC11EC36C /* InternalCollectionsUtilities.framework */, + D624A36A172644E61089C01C /* IssueReporting.framework */, + EBFD412FBBF9EB6E0025B260 /* IssueReportingPackageSupport.framework */, + BB0DCAECA21A97CA89433C0A /* LogMacro.framework */, + BBBC1F55BDCC1315B9087973 /* Model.framework */, + 88FE3677C3610371E1170004 /* Moya.framework */, + F9C31694C387837622262B91 /* Networking.framework */, + 0C5B9ED8AF81AD77FD0BEB32 /* NetworkService.framework */, + 9DF07BBEC2B8DEDC4C260EE3 /* OrderedCollections.framework */, + 9F25AD8B4EEDAC2332E15E93 /* Perception.framework */, + EA9632F0C162504B354411BA /* PerceptionCore.framework */, + 2E4B88860DA7B41658B863F5 /* Repository.framework */, + B3BA2FAA745DD13973199F1D /* RootTab_Debug.framework */, + AF2A2E6241A5A45BB177C029 /* RootTab_Prod.framework */, + 4116724BFD665612C48F13C2 /* RootTab_Stage.framework */, + 3E85D726FFB83324402F614D /* RootTab.framework */, + 42DCC593E8E4EF3777E4243E /* RootTabTests.xctest */, + 68CB45E1582E9F8F0CFCB2E1 /* RxMoya.framework */, + 2316853B90E5B192180FED43 /* RxSwift.framework */, + 20BDF3EACCD72BFA26DD9CE9 /* Search.framework */, + F21D37FBB009BC838E8D1561 /* Shared.framework */, + 0CAE284E7D53D427482FC3AA /* Sharing.framework */, + ED64B320ED1FA03A8436CB4A /* Sharing1.framework */, + 0AC4945177993F780482E796 /* Sharing2.framework */, + 56E09369F4C9A91174D69228 /* swift-composable-architecture_ComposableArchitecture.bundle */, + 513D11EBC521663F8B0ED08B /* swift-sharing_Sharing.bundle */, + 21290B6BFDDAEDB8E29DABEB /* SwiftNavigation.framework */, + 0455A99419CDC6EB61F00806 /* SwiftUINavigation.framework */, + 1FDDED00488067E78E755A8F /* UIKitNavigation.framework */, + C784BE51019B23768C0561E0 /* UIKitNavigationShim.framework */, + 8E4568F41C95DE2CF031AD82 /* UseCase.framework */, + 029F1A2624AF00C024047375 /* WeaveDI.framework */, + FF650514C2BEB59DA6183832 /* XCTestDynamicOverlay.framework */, + ); + name = Products; + sourceTree = ""; + }; + EF042538D859D06E04E4EBD6 /* View */ = { + isa = PBXGroup; + children = ( + CEBC238C3D0EE65C15C6809D /* RootTabBarView.swift */, + ); + path = View; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 119A41C36F9F57A3C548D3FC /* RootTab-Prod */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4883016E5BF0EA58E0F76A96 /* Build configuration list for PBXNativeTarget "RootTab-Prod" */; + buildPhases = ( + 08382B116639E7E28AD49D20 /* Sources */, + 2B9D935BBFF729F8A2CEAC6F /* Resources */, + A0FE98E48B3F272EBAF199CF /* Frameworks */, + FC042CB35C00E28F6CF16BE5 /* Embed Frameworks */, + 8C56AE43B59108128A0EA423 /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "RootTab-Prod"; + packageProductDependencies = ( + ); + productName = RootTab_Prod; + productReference = AF2A2E6241A5A45BB177C029 /* RootTab_Prod.framework */; + productType = "com.apple.product-type.framework"; + }; + 582CF93C48A4A951B5798CC5 /* RootTab-Stage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 16BD3BDDBD4927CD555F8E43 /* Build configuration list for PBXNativeTarget "RootTab-Stage" */; + buildPhases = ( + 3BCAADF9BB8AA49C669477C6 /* Sources */, + 404D2E4BA0DDA6C19DC842A2 /* Resources */, + 66D9F9A6D2BD15457FCD140A /* Frameworks */, + 409F181E69A4B0E845844D4A /* Embed Frameworks */, + 9E2042A6CE82AD3A2311ADDE /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "RootTab-Stage"; + packageProductDependencies = ( + ); + productName = RootTab_Stage; + productReference = 4116724BFD665612C48F13C2 /* RootTab_Stage.framework */; + productType = "com.apple.product-type.framework"; + }; + 5E21E9921D0FCCDAEAA45BEC /* RootTabTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79E82843BBD168C5EC994BF8 /* Build configuration list for PBXNativeTarget "RootTabTests" */; + buildPhases = ( + 54FBEAC043F8419F5F7B00E4 /* Sources */, + B29865F5E5D6FC62AE3D51A2 /* Resources */, + B5BAA54684571E711CDB6A32 /* Frameworks */, + 84D519DFCB160BEC175355D0 /* Embed Frameworks */, + 9BD79EB7BDAAE9ECD9FCDFCA /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + F57B5A10B63D53EDB487C71C /* PBXTargetDependency */, + ); + name = RootTabTests; + packageProductDependencies = ( + ); + productName = RootTabTests; + productReference = 42DCC593E8E4EF3777E4243E /* RootTabTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 72FA08FD2BDC50438419AAB7 /* RootTab-Debug */ = { + isa = PBXNativeTarget; + buildConfigurationList = 404ED78329C6CDAA80E37425 /* Build configuration list for PBXNativeTarget "RootTab-Debug" */; + buildPhases = ( + 41D87F1AD216E83262CEE294 /* Sources */, + 2308A0A42A8381DE16B7290A /* Resources */, + 6BA9D57C48E8EB7DC5365F7C /* Frameworks */, + 1E7C8290BB6444594606C932 /* Embed Frameworks */, + 6D34138EE56F9A0FBDE1975E /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "RootTab-Debug"; + packageProductDependencies = ( + ); + productName = RootTab_Debug; + productReference = B3BA2FAA745DD13973199F1D /* RootTab_Debug.framework */; + productType = "com.apple.product-type.framework"; + }; + A57DF7FAED265CC780DD5AEE /* RootTab */ = { + isa = PBXNativeTarget; + buildConfigurationList = F47ECBE0F0175632FCC4E34C /* Build configuration list for PBXNativeTarget "RootTab" */; + buildPhases = ( + 2278DB421382BDA48F04D139 /* Sources */, + E0D038AE7F22E6DE241CFC00 /* Resources */, + CAFCA93819ACDA1F733456A4 /* Frameworks */, + DB771459623AEB5BE9C413FB /* Embed Frameworks */, + 699BF4F3CAF1CCEF0A9963CD /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RootTab; + packageProductDependencies = ( + ); + productName = RootTab; + productReference = 3E85D726FFB83324402F614D /* RootTab.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29BC1D722E4096C9E46AB722 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; + }; + buildConfigurationList = A9AF8D65F66357E4F8E0BA6B /* Build configuration list for PBXProject "RootTab" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = ko; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ko, + ); + mainGroup = 0B7A512A30456FADB463747E; + productRefGroup = 88E7052119BA92C3E4E294D2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A57DF7FAED265CC780DD5AEE /* RootTab */, + 72FA08FD2BDC50438419AAB7 /* RootTab-Debug */, + 119A41C36F9F57A3C548D3FC /* RootTab-Prod */, + 582CF93C48A4A951B5798CC5 /* RootTab-Stage */, + 5E21E9921D0FCCDAEAA45BEC /* RootTabTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2308A0A42A8381DE16B7290A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B9D935BBFF729F8A2CEAC6F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 404D2E4BA0DDA6C19DC842A2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B29865F5E5D6FC62AE3D51A2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C073C740B313BDB02B450FE1 /* Alamofire_Alamofire.bundle in Resources */, + B5315E7F2312D555D7FF5A23 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */, + 2EDAB4F665FE1D59D68E6272 /* swift-sharing_Sharing.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E0D038AE7F22E6DE241CFC00 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 08382B116639E7E28AD49D20 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B687D9CA6F2A4D8D9654CE7 /* MainTab.swift in Sources */, + 99FE16348C98C22F6A64EF94 /* RootTabReducer.swift in Sources */, + 6B9ED905C5325610C0727B8D /* RootTabBarView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2278DB421382BDA48F04D139 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB29B52EFA2DAFF460CC4D6C /* MainTab.swift in Sources */, + 9F8B97B641CA6855F1C7573D /* RootTabReducer.swift in Sources */, + CC9A88E1F02A28AFECB6F664 /* RootTabBarView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3BCAADF9BB8AA49C669477C6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3A1BC21C4119A100E2719935 /* MainTab.swift in Sources */, + EF3D86368E65E910E54C5D17 /* RootTabReducer.swift in Sources */, + 7828F1ABA4FF47C55DE4BE16 /* RootTabBarView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 41D87F1AD216E83262CEE294 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4822BD22E5924A5E5208838D /* MainTab.swift in Sources */, + F1C3EFAB5F9ADF31A182097B /* RootTabReducer.swift in Sources */, + BB3BEB308A57E7A68556B7AD /* RootTabBarView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FBEAC043F8419F5F7B00E4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0BE8FFE039BA9FBDCD637844 /* Test.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + F57B5A10B63D53EDB487C71C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RootTab; + target = A57DF7FAED265CC780DD5AEE /* RootTab */; + targetProxy = 9F55CFF021AF851B8FDFE053 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 02A45A85BF117531F7F4C852 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTabTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab.RootTabTests; + PRODUCT_NAME = RootTabTests; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 31E14D090A69D29A4A460F7F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3C4DE722550EB438BE094C7D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Stage-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Stage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 47C1202F68604AD20559EEA2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Debug-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Debug; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 987B6A373131CEB2FB5E0F1B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A006F66E5BF3AB4E1CBBED76 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTabTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab.RootTabTests; + PRODUCT_NAME = RootTabTests; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + AD53D08A16B01CB4B6D07435 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B67D2B5760B2AF5BF23253AD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + C903450B595439B4A1FF6B12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Prod-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Prod; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DA7BE7F6A171477E3CD87C03 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Stage-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Stage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + EE520818FA4A3C2AA81410AF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Prod-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Prod; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F3E70B40E0AEBDA2A12793F5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/RootTab-Debug-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.RootTab; + PRODUCT_NAME = RootTab_Debug; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 16BD3BDDBD4927CD555F8E43 /* Build configuration list for PBXNativeTarget "RootTab-Stage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3C4DE722550EB438BE094C7D /* Debug */, + DA7BE7F6A171477E3CD87C03 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 404ED78329C6CDAA80E37425 /* Build configuration list for PBXNativeTarget "RootTab-Debug" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 47C1202F68604AD20559EEA2 /* Debug */, + F3E70B40E0AEBDA2A12793F5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4883016E5BF0EA58E0F76A96 /* Build configuration list for PBXNativeTarget "RootTab-Prod" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE520818FA4A3C2AA81410AF /* Debug */, + C903450B595439B4A1FF6B12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 79E82843BBD168C5EC994BF8 /* Build configuration list for PBXNativeTarget "RootTabTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A006F66E5BF3AB4E1CBBED76 /* Debug */, + 02A45A85BF117531F7F4C852 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A9AF8D65F66357E4F8E0BA6B /* Build configuration list for PBXProject "RootTab" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B67D2B5760B2AF5BF23253AD /* Debug */, + 31E14D090A69D29A4A460F7F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F47ECBE0F0175632FCC4E34C /* Build configuration list for PBXNativeTarget "RootTab" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AD53D08A16B01CB4B6D07435 /* Debug */, + 987B6A373131CEB2FB5E0F1B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29BC1D722E4096C9E46AB722 /* Project object */; +} diff --git a/Projects/Presentation/RootTab/RootTab.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Projects/Presentation/RootTab/RootTab.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Stage.xcscheme b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Debug.xcscheme similarity index 75% rename from Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Stage.xcscheme rename to Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Debug.xcscheme index 9340dab..426ec5c 100644 --- a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Stage.xcscheme +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Debug.xcscheme @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "72FA08FD2BDC50438419AAB7" + BuildableName = "RootTab_Debug.framework" + BlueprintName = "RootTab-Debug" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -44,10 +44,10 @@ + BlueprintIdentifier = "72FA08FD2BDC50438419AAB7" + BuildableName = "RootTab_Debug.framework" + BlueprintName = "RootTab-Debug" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -60,10 +60,10 @@ + BlueprintIdentifier = "72FA08FD2BDC50438419AAB7" + BuildableName = "RootTab_Debug.framework" + BlueprintName = "RootTab-Debug" + ReferencedContainer = "container:RootTab.xcodeproj"> diff --git a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Prod.xcscheme b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Prod.xcscheme similarity index 76% rename from Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Prod.xcscheme rename to Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Prod.xcscheme index 95d4659..fd7ae81 100644 --- a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Prod.xcscheme +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Prod.xcscheme @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "119A41C36F9F57A3C548D3FC" + BuildableName = "RootTab_Prod.framework" + BlueprintName = "RootTab-Prod" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -44,10 +44,10 @@ + BlueprintIdentifier = "119A41C36F9F57A3C548D3FC" + BuildableName = "RootTab_Prod.framework" + BlueprintName = "RootTab-Prod" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -60,10 +60,10 @@ + BlueprintIdentifier = "119A41C36F9F57A3C548D3FC" + BuildableName = "RootTab_Prod.framework" + BlueprintName = "RootTab-Prod" + ReferencedContainer = "container:RootTab.xcodeproj"> diff --git a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Debug.xcscheme b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Stage.xcscheme similarity index 75% rename from Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Debug.xcscheme rename to Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Stage.xcscheme index 0fa5dea..281e58a 100644 --- a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service-Debug.xcscheme +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab-Stage.xcscheme @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "582CF93C48A4A951B5798CC5" + BuildableName = "RootTab_Stage.framework" + BlueprintName = "RootTab-Stage" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -44,10 +44,10 @@ + BlueprintIdentifier = "582CF93C48A4A951B5798CC5" + BuildableName = "RootTab_Stage.framework" + BlueprintName = "RootTab-Stage" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -60,10 +60,10 @@ + BlueprintIdentifier = "582CF93C48A4A951B5798CC5" + BuildableName = "RootTab_Stage.framework" + BlueprintName = "RootTab-Stage" + ReferencedContainer = "container:RootTab.xcodeproj"> diff --git a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service.xcscheme b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab.xcscheme similarity index 72% rename from Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service.xcscheme rename to Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab.xcscheme index b301ad6..de9ccc7 100644 --- a/Projects/Core/Data/Service/Service.xcodeproj/xcshareddata/xcschemes/Service.xcscheme +++ b/Projects/Presentation/RootTab/RootTab.xcodeproj/xcshareddata/xcschemes/RootTab.xcscheme @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "A57DF7FAED265CC780DD5AEE" + BuildableName = "RootTab.framework" + BlueprintName = "RootTab" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -33,10 +33,10 @@ parallelizable = "NO"> + BlueprintIdentifier = "5E21E9921D0FCCDAEAA45BEC" + BuildableName = "RootTabTests.xctest" + BlueprintName = "RootTabTests" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -54,10 +54,10 @@ + BlueprintIdentifier = "A57DF7FAED265CC780DD5AEE" + BuildableName = "RootTab.framework" + BlueprintName = "RootTab" + ReferencedContainer = "container:RootTab.xcodeproj"> @@ -70,10 +70,10 @@ + BlueprintIdentifier = "A57DF7FAED265CC780DD5AEE" + BuildableName = "RootTab.framework" + BlueprintName = "RootTab" + ReferencedContainer = "container:RootTab.xcodeproj"> diff --git a/Projects/Presentation/RootTab/RootTabTests/Sources/Test.swift b/Projects/Presentation/RootTab/RootTabTests/Sources/Test.swift new file mode 100644 index 0000000..a594e54 --- /dev/null +++ b/Projects/Presentation/RootTab/RootTabTests/Sources/Test.swift @@ -0,0 +1,8 @@ +// +// Test.swift +// MusicBandscape +// +// Created by Roy on 2025-10-28 +// Copyright © 2025 DDD , Ltd. All rights reserved. +// + diff --git a/Projects/Presentation/RootTab/Sources/Reducer/MainTab.swift b/Projects/Presentation/RootTab/Sources/Reducer/MainTab.swift new file mode 100644 index 0000000..9d823ab --- /dev/null +++ b/Projects/Presentation/RootTab/Sources/Reducer/MainTab.swift @@ -0,0 +1,22 @@ +// +// MainTab.swift +// RootTab +// +// Created by Wonji Suh on 10/28/25. +// + +import Foundation + +public enum MainTab: String, CaseIterable { + case home, search + + public var tabBarTitle: String { + switch self { + case .home: + return "홈" + + case .search: + return "검색" + } + } +} diff --git a/Projects/Presentation/RootTab/Sources/Reducer/RootTabReducer.swift b/Projects/Presentation/RootTab/Sources/Reducer/RootTabReducer.swift new file mode 100644 index 0000000..f03419e --- /dev/null +++ b/Projects/Presentation/RootTab/Sources/Reducer/RootTabReducer.swift @@ -0,0 +1,104 @@ +// +// RootTabReducer.swift +// RootTab +// +// Created by Wonji Suh on 10/28/25. +// + + +import Foundation +import ComposableArchitecture + +import Home +import Search + +@Reducer +public struct RootTabReducer { + public init() {} + + @ObservableState + public struct State: Equatable { + + var selectedTab: MainTab = .home + var homeCoordinator = HomeCoordinator.State() + var searchCoordinator = SearchCoordinator.State() + + public init() {} + + } + + public enum Action: ViewAction, BindableAction { + case binding(BindingAction) + case view(View) + case scope(ScopeAction) + + } + + //MARK: - ViewAction + @CasePathable + public enum View { + case selectTab(MainTab) + } + + @CasePathable + public enum ScopeAction { + case homeCoordinator(HomeCoordinator.Action) + case searchCoordinator(SearchCoordinator.Action) + } + + + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding(_): + return .none + + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + + case .scope(let scopeAction): + return handleScopeAction(state: &state, action: scopeAction) + + + } + } + Scope(state: \.homeCoordinator, action: \.scope.homeCoordinator) { + HomeCoordinator() + } + Scope(state: \.searchCoordinator, action: \.scope.searchCoordinator) { + SearchCoordinator() + } + } +} + +extension RootTabReducer { + private func handleViewAction( + state: inout State, + action: View + ) -> Effect { + switch action { + case .selectTab(let tab): + state.selectedTab = tab + return .none + + } + } + + private func handleScopeAction( + state: inout State, + action: ScopeAction + ) -> Effect { + switch action { + + case .homeCoordinator(.view(.switchTapBar)): + state.selectedTab = .search + return .none + + default: + return .none + } + } +} + diff --git a/Projects/Presentation/RootTab/Sources/View/RootTabBarView.swift b/Projects/Presentation/RootTab/Sources/View/RootTabBarView.swift new file mode 100644 index 0000000..f61b396 --- /dev/null +++ b/Projects/Presentation/RootTab/Sources/View/RootTabBarView.swift @@ -0,0 +1,73 @@ +// +// RootTabBarView.swift +// RootTab +// +// Created by Wonji Suh on 10/28/25. +// + +import SwiftUI +import ComposableArchitecture +import Home +import Search + +public struct RootTabBarView: View { + @Perception.Bindable var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + WithPerceptionTracking { + TabView(selection: $store.selectedTab) { + HomeCoordinatorView( + store: self.store.scope( + state: \.homeCoordinator, + action: \.scope.homeCoordinator) + ) + .tabItem { + Image(systemName: "house") + Text(MainTab.home.tabBarTitle) + } + .tag(MainTab.home) + + SearchCoordinatorView( + store: self.store.scope( + state: \.searchCoordinator, + action: \.scope.searchCoordinator) + ) + .tabItem { + Image(systemName: "magnifyingglass") + Text(MainTab.search.tabBarTitle) + } + .tag(MainTab.search) + } + .preferredColorScheme(.dark) + .accentColor(.green) + .onAppear { + setupTabBarAppearance() + } + } + } + + private func setupTabBarAppearance() { + let appearance = UITabBarAppearance() + appearance.configureWithOpaqueBackground() + appearance.backgroundColor = UIColor.black + + // 선택되지 않은 탭 아이템 색상 + appearance.stackedLayoutAppearance.normal.iconColor = UIColor.gray + appearance.stackedLayoutAppearance.normal.titleTextAttributes = [ + .foregroundColor: UIColor.gray + ] + + // 선택된 탭 아이템 색상 + appearance.stackedLayoutAppearance.selected.iconColor = UIColor.green + appearance.stackedLayoutAppearance.selected.titleTextAttributes = [ + .foregroundColor: UIColor.green + ] + + UITabBar.appearance().standardAppearance = appearance + UITabBar.appearance().scrollEdgeAppearance = appearance + } +} diff --git a/Projects/Presentation/Search/Derived/InfoPlists/Search-Debug-Info.plist b/Projects/Presentation/Search/Derived/InfoPlists/Search-Debug-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/Search/Derived/InfoPlists/Search-Debug-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/Search/Derived/InfoPlists/Search-Info.plist b/Projects/Presentation/Search/Derived/InfoPlists/Search-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/Search/Derived/InfoPlists/Search-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/Search/Derived/InfoPlists/Search-Prod-Info.plist b/Projects/Presentation/Search/Derived/InfoPlists/Search-Prod-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/Search/Derived/InfoPlists/Search-Prod-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/Search/Derived/InfoPlists/Search-Stage-Info.plist b/Projects/Presentation/Search/Derived/InfoPlists/Search-Stage-Info.plist new file mode 100644 index 0000000..323e5ec --- /dev/null +++ b/Projects/Presentation/Search/Derived/InfoPlists/Search-Stage-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/Search/Derived/InfoPlists/SearchTests-Info.plist b/Projects/Presentation/Search/Derived/InfoPlists/SearchTests-Info.plist new file mode 100644 index 0000000..6c40a6c --- /dev/null +++ b/Projects/Presentation/Search/Derived/InfoPlists/SearchTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Projects/Presentation/Search/Project.swift b/Projects/Presentation/Search/Project.swift new file mode 100644 index 0000000..16403d1 --- /dev/null +++ b/Projects/Presentation/Search/Project.swift @@ -0,0 +1,18 @@ +import Foundation +import ProjectDescription +import DependencyPlugin +import ProjectTemplatePlugin +import DependencyPackagePlugin + +let project = Project.makeAppModule( + name: "Search", + bundleId: .appBundleID(name: ".Search"), + product: .staticFramework, + settings: .settings(), + dependencies: [ + .Presentation(implements: .Detail), + .Core(implements: .Core), + .Shared(implements: .Shared), + ], + sources: ["Sources/**"] +) diff --git a/Projects/Presentation/Search/Search.xcodeproj/project.pbxproj b/Projects/Presentation/Search/Search.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9936e89 --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/project.pbxproj @@ -0,0 +1,1519 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 032E2923B00BFC5EAB76C5F7 /* SearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */; }; + 0554EE2B028EAB2732AC4224 /* NoResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */; }; + 05933ABED45C661592F54152 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; + 068014758BD4189A50A22581 /* SearchReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBAC0F518C8B647D636403B3 /* SearchReducer.swift */; }; + 07DA6B029D914657E2BD2542 /* SearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */; }; + 083AAE5467B64C2FE21F2F30 /* SearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */; }; + 0E2A94606D5F8C733A10766B /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B31AC52543F492AE4A5EB683 /* Detail.framework */; }; + 0E42EB3E01DD94FB0B5FBA9F /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832D284A74D4E6414910CF20 /* SearchBar.swift */; }; + 0FACF8A0863F9D6BF520EF77 /* SearchBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */; }; + 1462AE0EE40801CC09B49189 /* SearchResultsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */; }; + 177E90F24CFE83F52AE55F63 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B31AC52543F492AE4A5EB683 /* Detail.framework */; }; + 19835A581563202293853651 /* SearchBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */; }; + 1A59905ACAB58BB186CEE65F /* SearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */; }; + 1E0C983238AE5DDB78E2AFA1 /* SearchCategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */; }; + 1F2CF817A3A94BAACADA14CB /* SearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */; }; + 213869C3D7CFC1BEBA5AEDEB /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 382AEFFC63FBC3CADB8C4886 /* Core.framework */; }; + 21AEA66E1AC77285E6E9139B /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FFC64244B37FAB1CA8F104 /* SearchView.swift */; }; + 2679B42119011AADA9D53D5E /* SearchCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */; }; + 2E3F7B82CE323BFF013C8E89 /* SearchCategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */; }; + 2EA1CF2AB1B63A42B459351E /* TrendingCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585ABA4834C26FDBBC507545 /* TrendingCard.swift */; }; + 3145CF92191F3C7627A72610 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; + 37722F4E4E97B64B17CD6452 /* TrendingCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585ABA4834C26FDBBC507545 /* TrendingCard.swift */; }; + 3E0576AAE0C8B4FC66F34A6F /* SearchCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */; }; + 3E34368C30ABED5249008C16 /* SearchCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */; }; + 431E534326BD22ABCFB7EC89 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; + 47597AE2E4543CD5CEC83027 /* SearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */; }; + 4834DF582F5F5B08413382A1 /* NoResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */; }; + 4C68C53E026692506551213C /* swift-sharing_Sharing.bundle in Resources */ = {isa = PBXBuildFile; fileRef = BD73DA1FF53C3EE20E8E80D9 /* swift-sharing_Sharing.bundle */; }; + 4EDD946657CC53EA96711227 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; + 50E33F7AA1B30ECEF6D9569F /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832D284A74D4E6414910CF20 /* SearchBar.swift */; }; + 529B3290558325314CDCE555 /* swift-sharing_Sharing.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = BD73DA1FF53C3EE20E8E80D9 /* swift-sharing_Sharing.bundle */; }; + 53DC3B370554DD4FE1907B3D /* SearchReducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A7DA215A75CD3B31667AA8 /* SearchReducerTests.swift */; }; + 5433E98671951FFF1552A219 /* SearchCoordinatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */; }; + 58C772B95CE23DD892454DFC /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 382AEFFC63FBC3CADB8C4886 /* Core.framework */; }; + 5BBED3B611CE47950FDE55E3 /* SearchReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBAC0F518C8B647D636403B3 /* SearchReducer.swift */; }; + 6460877AAE9310DF18A29F73 /* SearchReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBAC0F518C8B647D636403B3 /* SearchReducer.swift */; }; + 660279A8778DB4CA4963C6A0 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FFC64244B37FAB1CA8F104 /* SearchView.swift */; }; + 66244C086D79D4B416E241CB /* TrendingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */; }; + 6AE8802B8093A592B2776A11 /* TrendingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */; }; + 6D110964F271BB40F9EA1256 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832D284A74D4E6414910CF20 /* SearchBar.swift */; }; + 73C8C9C729F36E591D8819B7 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8EC584C6ED40CBE84C34F4F6 /* swift-composable-architecture_ComposableArchitecture.bundle */; }; + 7B73E952D730B962AF145AF3 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B31AC52543F492AE4A5EB683 /* Detail.framework */; }; + 7D6BFCF1A2C6EC2413E8312D /* RecentSearchesSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */; }; + 84048AD51C15B9352C8AE379 /* SearchResultsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */; }; + 84E9BED6FB8EF5937F2AA5E0 /* SearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */; }; + 88D5E8ACE42E4EC8D6021DB8 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FFC64244B37FAB1CA8F104 /* SearchView.swift */; }; + 8A4429053A94EE4A35BBB3F6 /* Alamofire_Alamofire.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; + 8BBDB2AE6124D2EDC3E67DF7 /* swift-composable-architecture_ComposableArchitecture.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = 8EC584C6ED40CBE84C34F4F6 /* swift-composable-architecture_ComposableArchitecture.bundle */; }; + 92E21A2B2BDCCCE34E9F7813 /* TrendingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */; }; + 9D253C4A9A1B57889B8F2953 /* RecentSearchesSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */; }; + 9E7B6D31A8E9C6F32B34879A /* NoResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */; }; + 9EB903A194357CC77F455275 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 382AEFFC63FBC3CADB8C4886 /* Core.framework */; }; + 9FB2495E093C488736BCD44C /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 382AEFFC63FBC3CADB8C4886 /* Core.framework */; }; + A5F96BA39BB2AFDEFDE31B5A /* TrendingCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585ABA4834C26FDBBC507545 /* TrendingCard.swift */; }; + A70DE8D6C224C4D36913787B /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67FFC64244B37FAB1CA8F104 /* SearchView.swift */; }; + AA531DC1B2CECA3CE6E43876 /* RecentSearchesSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */; }; + AC04590E07695AE7A806FAD9 /* Search.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCEA3ABCBA70F49C90FFC61F /* Search.framework */; }; + B69BA5C7B4F7607CBCE8E36B /* Alamofire_Alamofire.bundle in Dependencies */ = {isa = PBXBuildFile; fileRef = CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */; }; + B768B8E59D8D8382F5259414 /* TrendingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */; }; + B76DF1968F84B3159E775540 /* SearchReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBAC0F518C8B647D636403B3 /* SearchReducer.swift */; }; + BDF946D802337DD7A2D1A177 /* SearchCategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */; }; + BE7F955DA751839B6BC7C2FE /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 382AEFFC63FBC3CADB8C4886 /* Core.framework */; }; + CF593945E307DECEEF7DB3B1 /* RecentSearchesSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */; }; + D23694761C0710DF26F0141F /* SearchCategoryFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */; }; + D33E8C016483DFE6D2C23AEF /* NoResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */; }; + D5BA731850FA95B2327B7337 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832D284A74D4E6414910CF20 /* SearchBar.swift */; }; + D71D569E6C008A1F0E49FB7E /* SearchBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */; }; + DE749EB0521960A9773EF9EA /* SearchResultItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */; }; + ED15806F779DDC9CF33114BC /* Detail.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B31AC52543F492AE4A5EB683 /* Detail.framework */; }; + F697D07F3868C4859C39DE7F /* SearchResultsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */; }; + F7C51787E550DFFA78FDC365 /* Detail.framework in Dependencies */ = {isa = PBXBuildFile; fileRef = B31AC52543F492AE4A5EB683 /* Detail.framework */; }; + F80BC0E5885317066A4B89D7 /* SearchResultsList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */; }; + F87AF19EBB604A1197E6B440 /* Shared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */; }; + F996E8A8E379D2DF6BC5C0F1 /* SearchBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */; }; + FF8512DCE45686236DB51683 /* TrendingCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585ABA4834C26FDBBC507545 /* TrendingCard.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1EEE6ADC761F6FE0DBEEBE9C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5A5799AE384BBD104247C169 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C8340F58B0B1AD7EA1B1F833; + remoteInfo = Search; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 0FD283A6D7CA26DA1D2B6937 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + B69BA5C7B4F7607CBCE8E36B /* Alamofire_Alamofire.bundle in Dependencies */, + 8BBDB2AE6124D2EDC3E67DF7 /* swift-composable-architecture_ComposableArchitecture.bundle in Dependencies */, + 529B3290558325314CDCE555 /* swift-sharing_Sharing.bundle in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 6937CB7822AAD687295A06FC /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 6FC38615B1ABA051B74C3A17 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 7B73E952D730B962AF145AF3 /* Detail.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 76E0925B21E7E0D9C62CCD20 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 79C4E01AD7B5259CF619B13A /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + F7C51787E550DFFA78FDC365 /* Detail.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 877F936C57E9C46C94BF2D4D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 87F6AD381EF611D98B300CE3 /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 0E2A94606D5F8C733A10766B /* Detail.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + 9D9977A71E7C7D1C574D5FE5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + ADFDA8A10722D3497DE73E8D /* Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstSubfolderSpec = 16; + files = ( + 177E90F24CFE83F52AE55F63 /* Detail.framework in Dependencies */, + ); + name = Dependencies; + runOnlyForDeploymentPostprocessing = 1; + }; + C3563AE397BC02972195D847 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Shared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CE78830EFDE634DA1AB3A4A /* SearchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SearchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 23309DCBDB6DD5358D0CCBB9 /* Search_Debug.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search_Debug.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCoordinator.swift; sourceTree = ""; }; + 382AEFFC63FBC3CADB8C4886 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47506C2B8CF716A0AD1E9198 /* Search-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Search-Info.plist"; sourceTree = ""; }; + 52A9264304AC4A55660FC942 /* Search_Stage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search_Stage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 585ABA4834C26FDBBC507545 /* TrendingCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendingCard.swift; sourceTree = ""; }; + 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentSearchesSection.swift; sourceTree = ""; }; + 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultsList.swift; sourceTree = ""; }; + 61A7DA215A75CD3B31667AA8 /* SearchReducerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchReducerTests.swift; sourceTree = ""; }; + 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCoordinatorView.swift; sourceTree = ""; }; + 67FFC64244B37FAB1CA8F104 /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = ""; }; + 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBackground.swift; sourceTree = ""; }; + 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoResultsView.swift; sourceTree = ""; }; + 832D284A74D4E6414910CF20 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; + 89062292A5D1E146E816F07A /* Search-Prod-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Search-Prod-Info.plist"; sourceTree = ""; }; + 8EC584C6ED40CBE84C34F4F6 /* swift-composable-architecture_ComposableArchitecture.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-composable-architecture_ComposableArchitecture.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendingSection.swift; sourceTree = ""; }; + 9F7B90DCA916662065A4C6E0 /* Search-Debug-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Search-Debug-Info.plist"; sourceTree = ""; }; + AEB09945E74C5CE5FAE1DE10 /* Search_Prod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search_Prod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B31AC52543F492AE4A5EB683 /* Detail.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Detail.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BD73DA1FF53C3EE20E8E80D9 /* swift-sharing_Sharing.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "swift-sharing_Sharing.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + C2D2C478D13AE32E718DB078 /* Search-Stage-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Search-Stage-Info.plist"; sourceTree = ""; }; + CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Alamofire_Alamofire.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + DCEA3ABCBA70F49C90FFC61F /* Search.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Search.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategoryFilter.swift; sourceTree = ""; }; + EBAC0F518C8B647D636403B3 /* SearchReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchReducer.swift; sourceTree = ""; }; + EE36648F12CA828C3FD7A48B /* SearchTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "SearchTests-Info.plist"; sourceTree = ""; }; + FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultItem.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4764E98A0E48BBD1C0A40DE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FB2495E093C488736BCD44C /* Core.framework in Frameworks */, + ED15806F779DDC9CF33114BC /* Detail.framework in Frameworks */, + AC04590E07695AE7A806FAD9 /* Search.framework in Frameworks */, + F87AF19EBB604A1197E6B440 /* Shared.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 618045CA542B989322537F6D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BE7F955DA751839B6BC7C2FE /* Core.framework in Frameworks */, + 431E534326BD22ABCFB7EC89 /* Shared.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AF7A1FB9B55E3E4C90138F79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9EB903A194357CC77F455275 /* Core.framework in Frameworks */, + 05933ABED45C661592F54152 /* Shared.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F07534F5059642EA773C9289 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 58C772B95CE23DD892454DFC /* Core.framework in Frameworks */, + 4EDD946657CC53EA96711227 /* Shared.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FB04F59C6B6FFF4627367441 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 213869C3D7CFC1BEBA5AEDEB /* Core.framework in Frameworks */, + 3145CF92191F3C7627A72610 /* Shared.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 092B684217D797260BE40BBB /* Project */ = { + isa = PBXGroup; + children = ( + 854023328EC09B4DB800D64A /* Derived */, + 18305E636FA294577FD65BBB /* SearchTests */, + F71AEF5F9FDF9F2A91959397 /* Sources */, + ); + name = Project; + sourceTree = ""; + }; + 0D1FA3D1345AFC274996A1F6 /* Sources */ = { + isa = PBXGroup; + children = ( + 61A7DA215A75CD3B31667AA8 /* SearchReducerTests.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 18305E636FA294577FD65BBB /* SearchTests */ = { + isa = PBXGroup; + children = ( + 0D1FA3D1345AFC274996A1F6 /* Sources */, + ); + path = SearchTests; + sourceTree = ""; + }; + 2145FAEF6757D082FF289DF4 /* View */ = { + isa = PBXGroup; + children = ( + 48A127E674006B317BBDFD31 /* Component */, + 67FFC64244B37FAB1CA8F104 /* SearchView.swift */, + ); + path = View; + sourceTree = ""; + }; + 48A127E674006B317BBDFD31 /* Component */ = { + isa = PBXGroup; + children = ( + 830A28B51C9D38E2AEBE05C2 /* NoResultsView.swift */, + 5BD6A57AD355AB93D4E292BD /* RecentSearchesSection.swift */, + 76C9FEC7F58C61D434418E21 /* SearchBackground.swift */, + 832D284A74D4E6414910CF20 /* SearchBar.swift */, + E00E7F194DDDBCAF03F13AB6 /* SearchCategoryFilter.swift */, + FBA500C554BA5FC819BE7596 /* SearchResultItem.swift */, + 5FA5C52ECA881681BEF82BE5 /* SearchResultsList.swift */, + 585ABA4834C26FDBBC507545 /* TrendingCard.swift */, + 96594EE4D7660BAD30E00EA1 /* TrendingSection.swift */, + ); + path = Component; + sourceTree = ""; + }; + 84BFA334710650A3234CA462 /* View */ = { + isa = PBXGroup; + children = ( + 6294650406D2FE2875E45ADC /* SearchCoordinatorView.swift */, + ); + path = View; + sourceTree = ""; + }; + 854023328EC09B4DB800D64A /* Derived */ = { + isa = PBXGroup; + children = ( + AC15BCAE73B741CFE572E836 /* InfoPlists */, + ); + path = Derived; + sourceTree = ""; + }; + 913934DE0D0A54111950D94B /* Main */ = { + isa = PBXGroup; + children = ( + CC9821B2A67BE0AFDAFB9C9D /* Reducer */, + 2145FAEF6757D082FF289DF4 /* View */, + ); + path = "Main "; + sourceTree = ""; + }; + A265AAF9885BC77A31761249 = { + isa = PBXGroup; + children = ( + 092B684217D797260BE40BBB /* Project */, + BEF3F41E9B860D2AF6E4FE8E /* Products */, + ); + sourceTree = ""; + }; + AC15BCAE73B741CFE572E836 /* InfoPlists */ = { + isa = PBXGroup; + children = ( + 9F7B90DCA916662065A4C6E0 /* Search-Debug-Info.plist */, + 47506C2B8CF716A0AD1E9198 /* Search-Info.plist */, + 89062292A5D1E146E816F07A /* Search-Prod-Info.plist */, + C2D2C478D13AE32E718DB078 /* Search-Stage-Info.plist */, + EE36648F12CA828C3FD7A48B /* SearchTests-Info.plist */, + ); + path = InfoPlists; + sourceTree = ""; + }; + BDB1368703B3042CDEC595F0 /* Reducer */ = { + isa = PBXGroup; + children = ( + 36834DC20C5C8180C9CD59A6 /* SearchCoordinator.swift */, + ); + path = Reducer; + sourceTree = ""; + }; + BEF3F41E9B860D2AF6E4FE8E /* Products */ = { + isa = PBXGroup; + children = ( + CCEB0430E005F10DFFE17636 /* Alamofire_Alamofire.bundle */, + 382AEFFC63FBC3CADB8C4886 /* Core.framework */, + B31AC52543F492AE4A5EB683 /* Detail.framework */, + 23309DCBDB6DD5358D0CCBB9 /* Search_Debug.framework */, + AEB09945E74C5CE5FAE1DE10 /* Search_Prod.framework */, + 52A9264304AC4A55660FC942 /* Search_Stage.framework */, + DCEA3ABCBA70F49C90FFC61F /* Search.framework */, + 1CE78830EFDE634DA1AB3A4A /* SearchTests.xctest */, + 125BD6F6F900FE0F16E9AFC8 /* Shared.framework */, + 8EC584C6ED40CBE84C34F4F6 /* swift-composable-architecture_ComposableArchitecture.bundle */, + BD73DA1FF53C3EE20E8E80D9 /* swift-sharing_Sharing.bundle */, + ); + name = Products; + sourceTree = ""; + }; + CB52ED1F5386EFCE6F08FF58 /* Coordinator */ = { + isa = PBXGroup; + children = ( + BDB1368703B3042CDEC595F0 /* Reducer */, + 84BFA334710650A3234CA462 /* View */, + ); + path = Coordinator; + sourceTree = ""; + }; + CC9821B2A67BE0AFDAFB9C9D /* Reducer */ = { + isa = PBXGroup; + children = ( + EBAC0F518C8B647D636403B3 /* SearchReducer.swift */, + ); + path = Reducer; + sourceTree = ""; + }; + F71AEF5F9FDF9F2A91959397 /* Sources */ = { + isa = PBXGroup; + children = ( + CB52ED1F5386EFCE6F08FF58 /* Coordinator */, + 913934DE0D0A54111950D94B /* Main */, + ); + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 07BC18765727814C00E81BA3 /* Search-Stage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 60DF61616F19AA48904388D6 /* Build configuration list for PBXNativeTarget "Search-Stage" */; + buildPhases = ( + A5BA3A79A9F1147557ED8BEB /* Sources */, + 24F25CDBF1CEF864E5BD04C9 /* Resources */, + AF7A1FB9B55E3E4C90138F79 /* Frameworks */, + 76E0925B21E7E0D9C62CCD20 /* Embed Frameworks */, + 87F6AD381EF611D98B300CE3 /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Search-Stage"; + packageProductDependencies = ( + ); + productName = Search_Stage; + productReference = 52A9264304AC4A55660FC942 /* Search_Stage.framework */; + productType = "com.apple.product-type.framework"; + }; + 5025AE41A60E1D1B5B67EC7D /* SearchTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 07EA95A7700BA1362F87E897 /* Build configuration list for PBXNativeTarget "SearchTests" */; + buildPhases = ( + 585BA06379A5E7F0163F8A29 /* Sources */, + BFE4DF0124DF27EC3591F41A /* Resources */, + 4764E98A0E48BBD1C0A40DE5 /* Frameworks */, + 9D9977A71E7C7D1C574D5FE5 /* Embed Frameworks */, + 0FD283A6D7CA26DA1D2B6937 /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + AA3269EFB3974985258C0DC9 /* PBXTargetDependency */, + ); + name = SearchTests; + packageProductDependencies = ( + ); + productName = SearchTests; + productReference = 1CE78830EFDE634DA1AB3A4A /* SearchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + ADF6FD6557B86CF1D0D142F4 /* Search-Debug */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2173A964CDD5E364DC23C0EE /* Build configuration list for PBXNativeTarget "Search-Debug" */; + buildPhases = ( + F3ECEE27F857EAA71EBC9A31 /* Sources */, + 98560064236716FF44531EAA /* Resources */, + 618045CA542B989322537F6D /* Frameworks */, + C3563AE397BC02972195D847 /* Embed Frameworks */, + 6FC38615B1ABA051B74C3A17 /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Search-Debug"; + packageProductDependencies = ( + ); + productName = Search_Debug; + productReference = 23309DCBDB6DD5358D0CCBB9 /* Search_Debug.framework */; + productType = "com.apple.product-type.framework"; + }; + BC9735B9FBE423AE69AD2C5D /* Search-Prod */ = { + isa = PBXNativeTarget; + buildConfigurationList = C76873DAF57B4EAF377DEA57 /* Build configuration list for PBXNativeTarget "Search-Prod" */; + buildPhases = ( + ACDD205046EB10BB45B50D85 /* Sources */, + D6FBCFF6B3DA0105DFC42CC2 /* Resources */, + F07534F5059642EA773C9289 /* Frameworks */, + 6937CB7822AAD687295A06FC /* Embed Frameworks */, + 79C4E01AD7B5259CF619B13A /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Search-Prod"; + packageProductDependencies = ( + ); + productName = Search_Prod; + productReference = AEB09945E74C5CE5FAE1DE10 /* Search_Prod.framework */; + productType = "com.apple.product-type.framework"; + }; + C8340F58B0B1AD7EA1B1F833 /* Search */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7959414547E0A4954D52B231 /* Build configuration list for PBXNativeTarget "Search" */; + buildPhases = ( + 435B521C004F6947D667BECF /* Sources */, + 9C5ABED26914D47B4B506F60 /* Resources */, + FB04F59C6B6FFF4627367441 /* Frameworks */, + 877F936C57E9C46C94BF2D4D /* Embed Frameworks */, + ADFDA8A10722D3497DE73E8D /* Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Search; + packageProductDependencies = ( + ); + productName = Search; + productReference = DCEA3ABCBA70F49C90FFC61F /* Search.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5A5799AE384BBD104247C169 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + TargetAttributes = { + }; + }; + buildConfigurationList = 731940972587373E5B45F8C7 /* Build configuration list for PBXProject "Search" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = ko; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ko, + ); + mainGroup = A265AAF9885BC77A31761249; + productRefGroup = BEF3F41E9B860D2AF6E4FE8E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C8340F58B0B1AD7EA1B1F833 /* Search */, + ADF6FD6557B86CF1D0D142F4 /* Search-Debug */, + BC9735B9FBE423AE69AD2C5D /* Search-Prod */, + 07BC18765727814C00E81BA3 /* Search-Stage */, + 5025AE41A60E1D1B5B67EC7D /* SearchTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 24F25CDBF1CEF864E5BD04C9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98560064236716FF44531EAA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9C5ABED26914D47B4B506F60 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BFE4DF0124DF27EC3591F41A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A4429053A94EE4A35BBB3F6 /* Alamofire_Alamofire.bundle in Resources */, + 73C8C9C729F36E591D8819B7 /* swift-composable-architecture_ComposableArchitecture.bundle in Resources */, + 4C68C53E026692506551213C /* swift-sharing_Sharing.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D6FBCFF6B3DA0105DFC42CC2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 435B521C004F6947D667BECF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 07DA6B029D914657E2BD2542 /* SearchCoordinator.swift in Sources */, + 3E0576AAE0C8B4FC66F34A6F /* SearchCoordinatorView.swift in Sources */, + 6460877AAE9310DF18A29F73 /* SearchReducer.swift in Sources */, + D33E8C016483DFE6D2C23AEF /* NoResultsView.swift in Sources */, + 7D6BFCF1A2C6EC2413E8312D /* RecentSearchesSection.swift in Sources */, + 19835A581563202293853651 /* SearchBackground.swift in Sources */, + D5BA731850FA95B2327B7337 /* SearchBar.swift in Sources */, + 1E0C983238AE5DDB78E2AFA1 /* SearchCategoryFilter.swift in Sources */, + 032E2923B00BFC5EAB76C5F7 /* SearchResultItem.swift in Sources */, + F697D07F3868C4859C39DE7F /* SearchResultsList.swift in Sources */, + A5F96BA39BB2AFDEFDE31B5A /* TrendingCard.swift in Sources */, + 66244C086D79D4B416E241CB /* TrendingSection.swift in Sources */, + 660279A8778DB4CA4963C6A0 /* SearchView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 585BA06379A5E7F0163F8A29 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53DC3B370554DD4FE1907B3D /* SearchReducerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A5BA3A79A9F1147557ED8BEB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84E9BED6FB8EF5937F2AA5E0 /* SearchCoordinator.swift in Sources */, + 2679B42119011AADA9D53D5E /* SearchCoordinatorView.swift in Sources */, + B76DF1968F84B3159E775540 /* SearchReducer.swift in Sources */, + 9E7B6D31A8E9C6F32B34879A /* NoResultsView.swift in Sources */, + AA531DC1B2CECA3CE6E43876 /* RecentSearchesSection.swift in Sources */, + 0FACF8A0863F9D6BF520EF77 /* SearchBackground.swift in Sources */, + 0E42EB3E01DD94FB0B5FBA9F /* SearchBar.swift in Sources */, + D23694761C0710DF26F0141F /* SearchCategoryFilter.swift in Sources */, + DE749EB0521960A9773EF9EA /* SearchResultItem.swift in Sources */, + F80BC0E5885317066A4B89D7 /* SearchResultsList.swift in Sources */, + FF8512DCE45686236DB51683 /* TrendingCard.swift in Sources */, + 6AE8802B8093A592B2776A11 /* TrendingSection.swift in Sources */, + 88D5E8ACE42E4EC8D6021DB8 /* SearchView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + ACDD205046EB10BB45B50D85 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 083AAE5467B64C2FE21F2F30 /* SearchCoordinator.swift in Sources */, + 5433E98671951FFF1552A219 /* SearchCoordinatorView.swift in Sources */, + 068014758BD4189A50A22581 /* SearchReducer.swift in Sources */, + 4834DF582F5F5B08413382A1 /* NoResultsView.swift in Sources */, + CF593945E307DECEEF7DB3B1 /* RecentSearchesSection.swift in Sources */, + D71D569E6C008A1F0E49FB7E /* SearchBackground.swift in Sources */, + 6D110964F271BB40F9EA1256 /* SearchBar.swift in Sources */, + BDF946D802337DD7A2D1A177 /* SearchCategoryFilter.swift in Sources */, + 1A59905ACAB58BB186CEE65F /* SearchResultItem.swift in Sources */, + 84048AD51C15B9352C8AE379 /* SearchResultsList.swift in Sources */, + 37722F4E4E97B64B17CD6452 /* TrendingCard.swift in Sources */, + 92E21A2B2BDCCCE34E9F7813 /* TrendingSection.swift in Sources */, + A70DE8D6C224C4D36913787B /* SearchView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F3ECEE27F857EAA71EBC9A31 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F2CF817A3A94BAACADA14CB /* SearchCoordinator.swift in Sources */, + 3E34368C30ABED5249008C16 /* SearchCoordinatorView.swift in Sources */, + 5BBED3B611CE47950FDE55E3 /* SearchReducer.swift in Sources */, + 0554EE2B028EAB2732AC4224 /* NoResultsView.swift in Sources */, + 9D253C4A9A1B57889B8F2953 /* RecentSearchesSection.swift in Sources */, + F996E8A8E379D2DF6BC5C0F1 /* SearchBackground.swift in Sources */, + 50E33F7AA1B30ECEF6D9569F /* SearchBar.swift in Sources */, + 2E3F7B82CE323BFF013C8E89 /* SearchCategoryFilter.swift in Sources */, + 47597AE2E4543CD5CEC83027 /* SearchResultItem.swift in Sources */, + 1462AE0EE40801CC09B49189 /* SearchResultsList.swift in Sources */, + 2EA1CF2AB1B63A42B459351E /* TrendingCard.swift in Sources */, + B768B8E59D8D8382F5259414 /* TrendingSection.swift in Sources */, + 21AEA66E1AC77285E6E9139B /* SearchView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + AA3269EFB3974985258C0DC9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Search; + target = C8340F58B0B1AD7EA1B1F833 /* Search */; + targetProxy = 1EEE6ADC761F6FE0DBEEBE9C /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 140EE46DBC278F70D646016B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Debug-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Debug; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4567E3C863E192E62025B73F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 4CC5ECEC0CDDAC727D4213F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Debug-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Debug; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 69581C56F70B06DA99CBFA2B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/SearchTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search.SearchTests; + PRODUCT_NAME = SearchTests; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + A897910A47733AF69FCD4262 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Stage-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Stage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + AFD799D827E89703D46A6588 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BB569FE11B5B00DF7A9275E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Prod-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Prod; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CC9F1680F743330437B157DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + DF50FC267F8BDE6B8D23EEBC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Prod-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Prod; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + E828B296DD1DDCBCD86B02E3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F894B393F6B89D7AA5841F73 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/Search-Stage-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search; + PRODUCT_NAME = Search_Stage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + FDDD66F86BE7D07E8AE9115A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-navigation/Sources/UIKitNavigationShim/include", + "$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include", + ); + INFOPLIST_FILE = "Derived/InfoPlists/SearchTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_CFLAGS = ( + "$(inherited)", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + ); + OTHER_SWIFT_FLAGS = ( + "$(inherited)", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/checkouts/swift-syntax/Sources/_SwiftSyntaxCShims/include/module.modulemap", + "-Xcc", + "-fmodule-map-file=$(SRCROOT)/../../../Tuist/.build/tuist-derived/UIKitNavigationShim/UIKitNavigationShim.modulemap", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/ComposableArchitectureMacros#ComposableArchitectureMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/DependenciesMacrosPlugin#DependenciesMacrosPlugin", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/LogMacroMacro#LogMacroMacro", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/PerceptionMacros#PerceptionMacros", + "-load-plugin-executable", + "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/WeaveDIMacros#WeaveDIMacros", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.Roy.Bandscape.Search.SearchTests; + PRODUCT_NAME = SearchTests; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 07EA95A7700BA1362F87E897 /* Build configuration list for PBXNativeTarget "SearchTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FDDD66F86BE7D07E8AE9115A /* Debug */, + 69581C56F70B06DA99CBFA2B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2173A964CDD5E364DC23C0EE /* Build configuration list for PBXNativeTarget "Search-Debug" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 140EE46DBC278F70D646016B /* Debug */, + 4CC5ECEC0CDDAC727D4213F7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 60DF61616F19AA48904388D6 /* Build configuration list for PBXNativeTarget "Search-Stage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A897910A47733AF69FCD4262 /* Debug */, + F894B393F6B89D7AA5841F73 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 731940972587373E5B45F8C7 /* Build configuration list for PBXProject "Search" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4567E3C863E192E62025B73F /* Debug */, + E828B296DD1DDCBCD86B02E3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7959414547E0A4954D52B231 /* Build configuration list for PBXNativeTarget "Search" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CC9F1680F743330437B157DB /* Debug */, + AFD799D827E89703D46A6588 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C76873DAF57B4EAF377DEA57 /* Build configuration list for PBXNativeTarget "Search-Prod" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BB569FE11B5B00DF7A9275E6 /* Debug */, + DF50FC267F8BDE6B8D23EEBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5A5799AE384BBD104247C169 /* Project object */; +} diff --git a/Projects/Presentation/Search/Search.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Projects/Presentation/Search/Search.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Debug.xcscheme b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Debug.xcscheme new file mode 100644 index 0000000..d35c4a6 --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Debug.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Prod.xcscheme b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Prod.xcscheme new file mode 100644 index 0000000..94eddda --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Prod.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Stage.xcscheme b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Stage.xcscheme new file mode 100644 index 0000000..7d934d6 --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search-Stage.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search.xcscheme b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search.xcscheme new file mode 100644 index 0000000..1bb6e87 --- /dev/null +++ b/Projects/Presentation/Search/Search.xcodeproj/xcshareddata/xcschemes/Search.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Presentation/Search/SearchTests/Sources/SearchReducerTests.swift b/Projects/Presentation/Search/SearchTests/Sources/SearchReducerTests.swift new file mode 100644 index 0000000..c1bb1c4 --- /dev/null +++ b/Projects/Presentation/Search/SearchTests/Sources/SearchReducerTests.swift @@ -0,0 +1,392 @@ +// +// SearchReducerTests.swift +// Search +// +// Created by Wonji Suh on 10/31/25. +// + +import Testing +import Foundation +import ComposableArchitecture + +@testable import Search // ← SearchReducer 모듈명에 맞게 조정해줘 +@testable import Core +@testable import Entity +import DomainInterface // MusicSearchUseCase 키 주입 + +// MARK: - Test Tags (선택) +extension Tag { + @Tag static var unit: Self + @Tag static var reducer: Self +} + +// MARK: - Stub UseCase + +private enum DummyError: Error { case fail } + +private struct StubMusicSearchUseCase: MusicSearchUseCaseProtocol { + var searchMusicHandler: @Sendable (String) async throws -> [Entity.MusicItem] = { _ in [] } + var fetchDetailHandler: @Sendable (Int) async throws -> Entity.MusicItem = { _ in .stub() } + var searchMediaHandler: @Sendable (String, String, String) async throws -> [Entity.MusicItem] = { _,_,_ in [] } + var getCategoryCountHandler: ([Entity.MusicItem], Entity.SearchCategory) -> Int = { results, category in + switch category { + case .all: return results.count + case .music: return results.filter { $0.mediaType == .music }.count + case .movies: return results.filter { $0.mediaType == .movie }.count + case .podcast:return results.filter { $0.mediaType == .podcast }.count + case .etc: return results.filter { $0.mediaType == .other }.count + } + } + + func searchMusic(searchQuery: String) async throws -> [Entity.MusicItem] { + try await searchMusicHandler(searchQuery) + } + + + func fetchTrackDetail(id: Int) async throws -> Entity.MusicItem { + try await fetchDetailHandler(id) + } + + func searchMedia(query: String, media: String, entity: String) async throws -> [Entity.MusicItem] { + try await searchMediaHandler(query, media, entity) + } + + func getCategoryCount(from results: [Entity.MusicItem], category: Entity.SearchCategory) -> Int { + getCategoryCountHandler(results, category) + } +} + +// MARK: - Fixtures + +private extension Entity.MusicItem { + static func make( + trackId: Int, + name: String, + mediaType: Entity.MediaType + ) -> Self { + .init( + trackId: trackId, + trackName: name, + album: "Album \(trackId)", + artist: "Artist \(trackId)", + artworkURL: URL(string: "https://example.com/\(trackId).png")!, + releaseDate: "2024-01-01T00:00:00Z", + genre: "Pop", + mediaType: mediaType + ) + } + + static func stub( + trackId: Int = 1, + trackName: String = "detail", + album: String = "Album", + artist: String = "Artist", + artworkURL: URL = URL(string: "https://example.com/100.png")!, + releaseDate: String = "2024-01-02T03:04:05Z", + genre: String = "Pop", + mediaType: Entity.MediaType = .music + ) -> Self { + .init( + trackId: trackId, + trackName: trackName, + album: album, + artist: artist, + artworkURL: artworkURL, + releaseDate: releaseDate, + genre: genre, + mediaType: mediaType + ) + } +} + +// MARK: - Suites + +@MainActor +@Suite("SearchReducerTests", .tags(.unit, .reducer)) +struct SearchReducerTests { + + @Test("searchTextChanged에 빈 문자열 넣으면 상태 초기화") + func searchTextChanged_empty_resets() async throws { + var initial = SearchReducer.State() + initial.searchText = "abc" + initial.allSearchResults = [.stub(trackId: 1)] + initial.filteredSearchResults = [.stub(trackId: 1)] + initial.currentSearchQuery = "abc" + initial.selectedCategory = .music + initial.musicCount = 1 + initial.movieCount = 2 + initial.podcastCount = 3 + initial.etcCount = 4 + + let store = TestStore(initialState: initial) { + SearchReducer() + } + + await store.send(.view(.searchTextChanged(""))) { state in + state.searchText = "" + state.allSearchResults = [] + state.filteredSearchResults = [] + state.currentSearchQuery = "" + state.selectedCategory = .all + state.musicCount = 0 + state.movieCount = 0 + state.podcastCount = 0 + state.etcCount = 0 + } + } + + @Test("searchSubmitted 성공: 최근검색어 갱신 + 결과/필터 세팅 + 로딩 Off") + func searchSubmitted_success_updatesRecentAndResults() async throws { + let samples: [Entity.MusicItem] = [ + .make(trackId: 1, name: "M-1", mediaType: .music), + .make(trackId: 2, name: "MV-1", mediaType: .movie), + .make(trackId: 3, name: "P-1", mediaType: .podcast), + ] + + var captured: (query: String, media: String, entity: String)? + let useCase = StubMusicSearchUseCase( + searchMediaHandler: { q, m, e in + captured = (q, m, e) + return samples + } + ) + + let store = TestStore(initialState: SearchReducer.State()) { + SearchReducer() + } withDependencies: { + $0[MusicSearchUseCase.self] = useCase + $0.mainQueue = .immediate + } + + store.exhaustivity = .off(showSkippedAssertions: false) + + await store.send(.view(.searchSubmitted("IU"))) { state in + state.isSearching = true + state.currentSearchQuery = "IU" + // recentSearches는 inner 처리 후 최종 확인 + } + + // 비동기 액션 소비 + await store.skipReceivedActions() + + // 최종 상태 검증 + #expect(store.state.isSearching == false) + #expect(store.state.currentSearchQuery == "IU") + #expect(store.state.recentSearches.first == "IU") + #expect(!store.state.allSearchResults.isEmpty) + #expect(!store.state.filteredSearchResults.isEmpty) + #expect(store.state.musicCount == 1) + #expect(store.state.movieCount == 1) + #expect(store.state.podcastCount == 1) + #expect(store.state.etcCount == 0) + + // 파라미터 검증: 기본은 카테고리 .all 이므로 media: "all", entity: "" + #expect(captured?.query == "IU") + #expect(captured?.media == "all") + #expect(captured?.entity == "") + } + + @Test("searchSubmitted: 동일 검색어 재입력 시 최근검색어 중복 제거 후 맨 앞에 위치") + func searchSubmitted_dedup_recentQueries() async throws { + let useCase = StubMusicSearchUseCase( + searchMediaHandler: { _,_,_ in [ .make(trackId: 1, name: "M", mediaType: .music) ] } + ) + + var initial = SearchReducer.State() + initial.recentSearches = ["IU", "NewJeans"] + + let store = TestStore(initialState: initial) { + SearchReducer() + } withDependencies: { + $0[MusicSearchUseCase.self] = useCase + $0.mainQueue = .immediate + } + + store.exhaustivity = .off(showSkippedAssertions: false) + + await store.send(.view(.searchSubmitted("IU"))) { state in + state.isSearching = true + state.currentSearchQuery = "IU" + // dedup은 inner 후 최종 검사 + } + await store.skipReceivedActions() + + #expect(store.state.recentSearches.first == "IU") + #expect(store.state.recentSearches.dropFirst().contains("IU") == false) + } + + @Test("selectRecentSearch는 입력값으로 searchSubmitted 다시 트리거") + func selectRecentSearch_triggersSubmit() async throws { + var submitted = "" + let useCase = StubMusicSearchUseCase( + searchMediaHandler: { q,_,_ in + submitted = q + return [ .make(trackId: 1, name: "M", mediaType: .music) ] + } + ) + + let store = TestStore(initialState: SearchReducer.State()) { + SearchReducer() + } withDependencies: { + $0[MusicSearchUseCase.self] = useCase + $0.mainQueue = .immediate + } + + store.exhaustivity = .off(showSkippedAssertions: false) + + await store.send(.view(.selectRecentSearch("coldplay"))) { state in + state.searchText = "coldplay" + } + await store.skipReceivedActions() + + #expect(submitted == "coldplay") + #expect(store.state.currentSearchQuery == "coldplay") + #expect(store.state.recentSearches.first == "coldplay") + #expect(store.state.musicCount == 1) + #expect(store.state.movieCount == 0) + #expect(store.state.podcastCount == 0) + #expect(store.state.etcCount == 0) + } + + @Test("selectCategory: currentSearchQuery가 있으면 새 검색 요청") + func selectCategory_withQuery_triggersNewSearch() async throws { + var initial = SearchReducer.State() + initial.currentSearchQuery = "beatles" // 이미 검색어 존재 + initial.selectedCategory = .all + + var captured: (media: String, entity: String)? + let useCase = StubMusicSearchUseCase( + searchMediaHandler: { q, m, e in + captured = (m, e) + return [ .make(trackId: 1, name: q, mediaType: .music) ] + } + ) + + let store = TestStore(initialState: initial) { + SearchReducer() + } withDependencies: { + $0[MusicSearchUseCase.self] = useCase + $0.mainQueue = .immediate + } + + store.exhaustivity = .off(showSkippedAssertions: false) + + await store.send(.view(.selectCategory(.music))) { state in + state.selectedCategory = .music + state.isSearching = true + } + await store.skipReceivedActions() + + #expect(store.state.isSearching == false) + #expect(captured?.media == "music") + #expect(captured?.entity == "song") + } + + @Test("selectCategory: currentSearchQuery가 없으면 필터만 적용") + func selectCategory_withoutQuery_filtersOnly() async throws { + var initial = SearchReducer.State() + initial.currentSearchQuery = "" + initial.selectedCategory = .all + + initial.allSearchResults = [ + .init(trackId: 1, trackName: "m1", album: "a", artist: "ar", + artworkURL: URL(string: "https://e.com/1.png")!, + releaseDate: "2024-01-01T00:00:00Z", genre: "Pop", mediaType: .music), + .init(trackId: 2, trackName: "m2", album: "a", artist: "ar", + artworkURL: URL(string: "https://e.com/2.png")!, + releaseDate: "2024-01-02T00:00:00Z", genre: "Pop", mediaType: .music), + .init(trackId: 3, trackName: "mv1", album: "a", artist: "ar", + artworkURL: URL(string: "https://e.com/3.png")!, + releaseDate: "2024-01-03T00:00:00Z", genre: "Drama", mediaType: .movie), + .init(trackId: 4, trackName: "etc1", album: "a", artist: "ar", + artworkURL: URL(string: "https://e.com/4.png")!, + releaseDate: "2024-01-04T00:00:00Z", genre: "Misc", mediaType: .other) + ] + + let store = TestStore(initialState: initial) { + SearchReducer() + } + + await store.send(.view(.selectCategory(.music))) { state in + state.selectedCategory = .music + state.filteredSearchResults = state.allSearchResults.filterByCategory(.music) + } + + #expect(store.state.filteredSearchResults.count == 2) + } + + @Test("clearSearch는 상태 전체 리셋") + func clearSearch_resetsAll() async throws { + var initial = SearchReducer.State() + initial.searchText = "zzz" + initial.currentSearchQuery = "hello" + initial.selectedCategory = .music + initial.allSearchResults = [.stub(trackId: 1)] + initial.filteredSearchResults = [.stub(trackId: 1)] + initial.musicCount = 1 + initial.movieCount = 1 + initial.podcastCount = 1 + initial.etcCount = 1 + + let store = TestStore(initialState: initial) { + SearchReducer() + } + + await store.send(.view(.clearSearch)) { state in + state.searchText = "" + state.allSearchResults = [] + state.filteredSearchResults = [] + state.currentSearchQuery = "" + state.selectedCategory = .all + state.musicCount = 0 + state.movieCount = 0 + state.podcastCount = 0 + state.etcCount = 0 + } + } + + @Test("selectMusicItem은 공유 상태에 디테일 저장") + func navigation_selectMusicItem_setsSharedDetail() async throws { + let picked = Entity.MusicItem.stub(trackId: 77, trackName: "Pick", mediaType: .music) + + let store = TestStore(initialState: SearchReducer.State()) { + SearchReducer() + } + + await store.send(.navigation(.selectMusicItem(picked))) { state in + state.$detailMusicItem.withLock { $0 = picked } + } + + #expect(store.state.detailMusicItem?.trackId == 77) + } + + @Test("searchSubmitted 실패 시 결과 초기화 및 isSearching false") + func searchSubmitted_failure_clearsAndStops() async throws { + let useCase = StubMusicSearchUseCase( + searchMediaHandler: { _,_,_ in throw DummyError.fail } + ) + + let store = TestStore(initialState: SearchReducer.State()) { + SearchReducer() + } withDependencies: { + $0[MusicSearchUseCase.self] = useCase + $0.mainQueue = .immediate + } + + store.exhaustivity = .off(showSkippedAssertions: false) + + await store.send(.view(.searchSubmitted("error"))) { state in + state.isSearching = true + state.currentSearchQuery = "error" + } + await store.skipReceivedActions() + + #expect(store.state.isSearching == false) + #expect(store.state.allSearchResults.isEmpty) + #expect(store.state.filteredSearchResults.isEmpty) + #expect(store.state.musicCount == 0) + #expect(store.state.movieCount == 0) + #expect(store.state.podcastCount == 0) + #expect(store.state.etcCount == 0) + } +} diff --git a/Projects/Presentation/Search/Sources/Coordinator/Reducer/SearchCoordinator.swift b/Projects/Presentation/Search/Sources/Coordinator/Reducer/SearchCoordinator.swift new file mode 100644 index 0000000..6da2ce2 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Coordinator/Reducer/SearchCoordinator.swift @@ -0,0 +1,102 @@ +// +// SearchCoordinator.swift +// Search +// +// Created by Wonji Suh on 10/28/25. +// + +import Foundation +import ComposableArchitecture +import TCACoordinators + +import Core +import Detail + + +@Reducer +public struct SearchCoordinator { + public init() {} + + @ObservableState + public struct State: Equatable { + + var routes: [Route] + public init() { + self.routes = [.root(.search(.init()), embedInNavigationView: true)] + } + } + + public enum Action: ViewAction { + case router(IndexedRouterActionOf) + case view(View) + + } + + public enum View { + case backToRoot + } + + private enum CancelID: Hashable { + case screen + } + + public var body: some Reducer { + Reduce { state, action in + switch action { + + case .router(let routeAction): + return routerAction(state: &state, action: routeAction) + + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + + } + } + .forEachRoute(\.routes, action: \.router, cancellationId: CancelID.screen) + } +} + +extension SearchCoordinator { + private func routerAction( + state: inout State, + action: IndexedRouterActionOf + ) -> Effect { + switch action { + + case .routeAction(id: _, action: .search(.navigation(.selectMusicItem(let item)))): + state.routes.push(.detail(.init(musicItem: item))) + return .none + + case .routeAction(id: _, action: .detail(.navigation(.backToHome))): +// state.routes.goBackToRoot() + return .send(.view(.backToRoot)) + + default: + return .none + + } + } + + private func handleViewAction( + state: inout State, + action: View + ) -> Effect { + switch action { + case .backToRoot: + state.routes.goBackTo(\.search) + return .none + + } + } +} + + +extension SearchCoordinator { + + @Reducer(state: .equatable) + public enum SearchScreen { + case search(SearchReducer) + case detail(DetailReducer) + } +} + diff --git a/Projects/Presentation/Search/Sources/Coordinator/View/SearchCoordinatorView.swift b/Projects/Presentation/Search/Sources/Coordinator/View/SearchCoordinatorView.swift new file mode 100644 index 0000000..bdd3f80 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Coordinator/View/SearchCoordinatorView.swift @@ -0,0 +1,34 @@ +// +// SearchCoordinatorView.swift +// Search +// +// Created by Wonji Suh on 10/28/25. +// + +import SwiftUI +import ComposableArchitecture +import TCACoordinators + +import Detail + +public struct SearchCoordinatorView: View { + @Perception.Bindable var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + TCARouter(store.scope(state: \.routes, action: \.router)) { screens in + switch screens.case { + case .search(let searchStore): + SearchView(store: searchStore) + .navigationBarBackButtonHidden() + + case .detail(let detailStore): + DetailView(store: detailStore) + .navigationBarBackButtonHidden() + } + } + } +} diff --git a/Projects/Presentation/Search/Sources/Main /Reducer/SearchReducer.swift b/Projects/Presentation/Search/Sources/Main /Reducer/SearchReducer.swift new file mode 100644 index 0000000..e331319 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /Reducer/SearchReducer.swift @@ -0,0 +1,260 @@ +// +// SearchReducer.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + + +import Foundation +import ComposableArchitecture +import Core +import Entity + +@Reducer +public struct SearchReducer { + public init() {} + + @ObservableState + public struct State: Equatable { + var searchText: String = "" + var recentSearches: [String] = [] + var allSearchResults: [MusicItem] = [] + var filteredSearchResults: [MusicItem] = [] + var isSearching: Bool = false + var currentSearchQuery: String = "" + var selectedCategory: SearchCategory = .all + var musicCount: Int = 0 + var movieCount: Int = 0 + var podcastCount: Int = 0 + var etcCount: Int = 0 + + @Shared(.inMemory("MusicItem")) var detailMusicItem : MusicItem? = nil + + public init() {} + } + + public enum Action: ViewAction, BindableAction { + case binding(BindingAction) + case view(View) + case async(AsyncAction) + case inner(InnerAction) + case navigation(NavigationAction) + + } + + //MARK: - ViewAction + @CasePathable + public enum View { + case searchTextChanged(String) + case searchSubmitted(String) + case selectRecentSearch(String) + case selectCategory(SearchCategory) + case selectTrendingItem(String) + case clearSearch + } + + + + //MARK: - AsyncAction 비동기 처리 액션 + public enum AsyncAction: Equatable { + case searchMedia(query: String, category: SearchCategory) + } + + //MARK: - 앱내에서 사용하는 액션 + public enum InnerAction { + case searchResponse(Result<[MusicItem], Error>) + } + + //MARK: - NavigationAction + public enum NavigationAction: Equatable { + case selectMusicItem(MusicItem) + + } + + private enum CancelID: Hashable { + case searchMedia + } + + @Dependency(MusicSearchUseCase.self) var musicSearchUseCase + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding(_): + return .none + + case .view(let viewAction): + return handleViewAction(state: &state, action: viewAction) + + case .async(let asyncAction): + return handleAsyncAction(state: &state, action: asyncAction) + + case .inner(let innerAction): + return handleInnerAction(state: &state, action: innerAction) + + case .navigation(let navigationAction): + return handleNavigationAction(state: &state, action: navigationAction) + } + } + } +} + +extension SearchReducer { + private func handleViewAction( + state: inout State, + action: View + ) -> Effect { + switch action { + case .searchTextChanged(let text): + state.searchText = text + + // 검색어가 비어있으면 초기 상태로 복원 + if text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + state.allSearchResults = [] + state.filteredSearchResults = [] + state.currentSearchQuery = "" + state.selectedCategory = .all + state.musicCount = 0 + state.movieCount = 0 + state.podcastCount = 0 + state.etcCount = 0 + state.isSearching = false + } + return .cancel(id: CancelID.searchMedia) + + case .searchSubmitted(let searchText): + let trimmedText = searchText.trimmingCharacters(in: .whitespacesAndNewlines) + if !trimmedText.isEmpty { + // 기존 검색어가 있으면 제거하고 앞에 추가 + state.recentSearches.removeAll { $0 == trimmedText } + state.recentSearches.insert(trimmedText, at: 0) + + // 최대 10개까지만 저장 + if state.recentSearches.count > 10 { + state.recentSearches = Array(state.recentSearches.prefix(10)) + } + + // 검색 실행 + state.isSearching = true + state.currentSearchQuery = trimmedText + return .send(.async(.searchMedia(query: trimmedText, category: state.selectedCategory))) + } + return .none + + case .selectRecentSearch(let searchText): + state.searchText = searchText + return .send(.view(.searchSubmitted(searchText))) + + case .selectTrendingItem(let searchText): + state.searchText = searchText + return .send(.view(.searchSubmitted(searchText))) + + + case .selectCategory(let category): + state.selectedCategory = category + + // 현재 검색어가 있으면 새로운 카테고리로 다시 검색 + if !state.currentSearchQuery.isEmpty { + state.isSearching = true + return .send(.async(.searchMedia(query: state.currentSearchQuery, category: category))) + } else { + // 검색어가 없으면 기존 결과를 필터링만 (정렬은 이미 되어있음) + state.filteredSearchResults = state.allSearchResults.filterByCategory(category) + return .none + } + + case .clearSearch: + state.searchText = "" + state.allSearchResults = [] + state.filteredSearchResults = [] + state.currentSearchQuery = "" + state.selectedCategory = .all + state.musicCount = 0 + state.movieCount = 0 + state.podcastCount = 0 + state.etcCount = 0 + return .none + } + } + + + + + private func handleAsyncAction( + state: inout State, + action: AsyncAction + ) -> Effect { + switch action { + case .searchMedia(let query, let category): + return .run { send in + let searchResult = await Result { + // 카테고리에 따라 다른 media/entity 조합으로 검색 + switch category { + case .all: + // 모든 미디어 타입 검색 + try await musicSearchUseCase.searchMedia(query: query, media: "all", entity: "") + case .music: + // 음악만 검색 + try await musicSearchUseCase.searchMedia(query: query, media: "music", entity: "song") + case .movies: + // 영화 검색 + try await musicSearchUseCase.searchMedia(query: query, media: "movie", entity: "movie") + case .podcast: + // 팟캐스트 검색 + try await musicSearchUseCase.searchMedia(query: query, media: "podcast", entity: "podcast") + case .etc: + // 기타 미디어 검색 + try await musicSearchUseCase.searchMedia(query: query, media: "all", entity: "") + } + } + + await send(.inner(.searchResponse(searchResult))) + } + .cancellable(id: CancelID.searchMedia, cancelInFlight: true) + } + } + + private func handleNavigationAction( + state: inout State, + action: NavigationAction + ) -> Effect { + switch action { + case .selectMusicItem(let musicItem): + state.$detailMusicItem.withLock { $0 = musicItem } + return .none + } + } + + private func handleInnerAction( + state: inout State, + action: InnerAction + ) -> Effect { + switch action { + case .searchResponse(let result): + state.isSearching = false + + switch result { + case .success(let results): + let sortedResults = results.sortedByLatest() + state.allSearchResults = sortedResults + state.filteredSearchResults = sortedResults.filterByCategory(state.selectedCategory) + state.musicCount = musicSearchUseCase.getCategoryCount(from: sortedResults, category: .music) + state.movieCount = musicSearchUseCase.getCategoryCount(from: sortedResults, category: .movies) + state.podcastCount = musicSearchUseCase.getCategoryCount(from: sortedResults, category: .podcast) + state.etcCount = musicSearchUseCase.getCategoryCount(from: sortedResults, category: .etc) + case .failure(let error): + print("🔥 검색 에러: \(error.localizedDescription)") + state.allSearchResults = [] + state.filteredSearchResults = [] + state.musicCount = 0 + state.movieCount = 0 + state.podcastCount = 0 + state.etcCount = 0 + } + + return .none + } + } +} diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/NoResultsView.swift b/Projects/Presentation/Search/Sources/Main /View/Component/NoResultsView.swift new file mode 100644 index 0000000..c2ee455 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/NoResultsView.swift @@ -0,0 +1,103 @@ +// +// NoResultsView.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem + +struct NoResultsView: View { + let searchQuery: String + var onSuggestionTap: (String) -> Void = { _ in } + + private let suggestions = ["Top Hits", "K-Pop", "Jazz", "Podcasts"] + + var body: some View { + VStack(spacing: 24) { + Spacer() + + // 검색 아이콘 + Image(systemName: "magnifyingglass") + .font(.system(size: 80, weight: .light)) + .foregroundStyle(.gray.opacity(0.6)) + + VStack(spacing: 12) { + // "No results found" 메시지 + Text("No results found") + .font(.pretendardFont(family: .semiBold, size: 20)) + .foregroundStyle(.white) + + // 서브 메시지 + Text("Try different keywords or check spelling") + .font(.pretendardFont(family: .regular, size: 16)) + .foregroundStyle(.gray) + .multilineTextAlignment(.center) + } + + VStack(alignment: .leading, spacing: 16) { + // "Suggestions:" 텍스트 + HStack { + Spacer() + + Text("Suggestions:") + .font(.pretendardFont(family: .semiBold, size: 16)) + .foregroundStyle(.white) + + Spacer() + } + + // 제안 태그들 + HStack(spacing: 12) { + SuggestionTag(text: "Top Hits") { + onSuggestionTap("Top Hits") + } + + SuggestionTag(text: "K-Pop") { + onSuggestionTap("K-Pop") + } + + SuggestionTag(text: "Jazz") { + onSuggestionTap("Jazz") + } + + SuggestionTag(text: "Podcasts") { + onSuggestionTap("Podcasts") + } + + Spacer() + } + } + .padding(.horizontal, 20) + + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } +} + +struct SuggestionTag: View { + let text: String + let onTap: () -> Void + + var body: some View { + Button(action: onTap) { + Text(text) + .font(.pretendardFont(family: .medium, size: 14)) + .foregroundStyle(.gray) + .padding(.horizontal, 16) + .padding(.vertical, 10) + .background( + RoundedRectangle(cornerRadius: 20, style: .continuous) + .fill(.gray.opacity(0.2)) + ) + } + .buttonStyle(PlainButtonStyle()) + } +} + +#Preview { + NoResultsView(searchQuery: "Top Hits") + .background(Color.black) +} diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/RecentSearchesSection.swift b/Projects/Presentation/Search/Sources/Main /View/Component/RecentSearchesSection.swift new file mode 100644 index 0000000..617f41d --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/RecentSearchesSection.swift @@ -0,0 +1,79 @@ +// +// RecentSearchesSection.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem + +struct RecentSearchesSection: View { + let recentSearches: [String] + var onTapSearch: (String) -> Void = { _ in } + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 8) { + Image(systemName: "clock") + .font(.pretendardFont(family: .semiBold, size: 16)) + .foregroundStyle(.gray) + + Text("Recent Searches") + .font(.pretendardFont(family: .semiBold, size: 18)) + .foregroundStyle(.white) + + Spacer() + } + .padding(.horizontal, 20) + + if !recentSearches.isEmpty { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 12) { + ForEach(recentSearches, id: \.self) { search in + SearchTag(text: search) { + onTapSearch(search) + } + } + } + .padding(.horizontal, 20) + } + } else { + HStack { + Text("No recent searches") + .font(.pretendardFont(family: .regular, size: 14)) + .foregroundStyle(.gray) + + Spacer() + } + .padding(.horizontal, 20) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } +} + +struct SearchTag: View { + let text: String + let onTap: () -> Void + + var body: some View { + Button(action: onTap) { + Text(text) + .font(.pretendardFont(family: .medium, size: 14)) + .foregroundStyle(.white) + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 20, style: .continuous) + .fill(Color.gray.opacity(0.3)) + ) + } + .buttonStyle(PlainButtonStyle()) + } +} + +#Preview { + RecentSearchesSection(recentSearches: ["Top Hits", "K-Pop", "Jazz", "Marvel"]) + .background(Color.black) +} \ No newline at end of file diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/SearchBackground.swift b/Projects/Presentation/Search/Sources/Main /View/Component/SearchBackground.swift new file mode 100644 index 0000000..f31652d --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/SearchBackground.swift @@ -0,0 +1,53 @@ +// +// SearchBackground.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem + +public struct SearchBackground: View { + + public init() {} + + public var body: some View { + ZStack { + LinearGradient( + colors: [ + Color.backgroundDark, + Color.neutralBlack, + Color.nightRider, + ], + startPoint: .topTrailing, + endPoint: .bottomLeading + ) + + + RadialGradient( + gradient: Gradient(colors: [ + Color.white.opacity(0.08), + Color.clear + ]), + center: .top, + startRadius: 20, + endRadius: 420 + ) + .blendMode(.softLight) + + LinearGradient( + colors: [ + Color.green.opacity(0.06), + Color.clear + ], + startPoint: .top, + endPoint: .center + ) + .blur(radius: 40) + .allowsHitTesting(false) + } + .ignoresSafeArea() + } +} + diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/SearchBar.swift b/Projects/Presentation/Search/Sources/Main /View/Component/SearchBar.swift new file mode 100644 index 0000000..e4239d3 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/SearchBar.swift @@ -0,0 +1,81 @@ +// +// SearchBar.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem + +struct SearchBar: View { + let searchText: String + var onTextChange: (String) -> Void = { _ in } + var onSearchSubmit: (String) -> Void = { _ in } + var onClearSearch: () -> Void = {} + + @State private var internalText: String = "" + + var body: some View { + HStack(spacing: 12) { + Image(systemName: "magnifyingglass") + .font(.pretendardFont(family: .medium, size: 16)) + .foregroundStyle(.gray) + + ZStack(alignment: .leading) { + if internalText.isEmpty { + Text("검색 할 영화 또는 음악을 입력하세요!") + .font(.pretendardFont(family: .regular, size: 16)) + .foregroundStyle(.gray.opacity(0.6)) + } + + TextField("", text: $internalText) + .font(.pretendardFont(family: .regular, size: 16)) + .foregroundStyle(.white) + .submitLabel(.search) + .onChange(of: internalText) { newValue in + onTextChange(newValue) + } + .onSubmit { + if !internalText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + onSearchSubmit(internalText) + } + } + } + + if !internalText.isEmpty { + Button(action: { + internalText = "" + onClearSearch() + }) { + Image(systemName: "xmark.circle.fill") + .font(.system(size: 18)) + .foregroundStyle(.gray) + } + .buttonStyle(PlainButtonStyle()) + } + } + .padding(.horizontal, 14) + .frame(height: 48) + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(.neutralBlack) + .overlay( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .stroke(.gray.opacity(0.2), lineWidth: 1) + ) + ) + .padding(.leading, 16) + .onAppear { + internalText = searchText + } + .onChange(of: searchText) { newValue in + internalText = newValue + } + } +} + +#Preview { + SearchBar(searchText: "") + .background(Color.black) +} diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/SearchCategoryFilter.swift b/Projects/Presentation/Search/Sources/Main /View/Component/SearchCategoryFilter.swift new file mode 100644 index 0000000..010ba9c --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/SearchCategoryFilter.swift @@ -0,0 +1,121 @@ +// +// SearchCategoryFilter.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem +import Entity + +struct SearchCategoryFilter: View { + let selectedCategory: SearchCategory + let musicCount: Int + let movieCount: Int + let podcastCount: Int + let etcCount: Int + var onCategorySelect: (SearchCategory) -> Void = { _ in } + + var body: some View { + ScrollViewReader { proxy in + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 16) { + ForEach(SearchCategory.allCases, id: \.self) { category in + CategoryTab( + category: category, + isSelected: selectedCategory == category, + count: countForCategory(category), + onTap: { + onCategorySelect(category) + } + ) + .id(category) + } + } + .padding(.horizontal, 20) + } + .onChange(of: selectedCategory) { newCategory in + withAnimation(.easeInOut(duration: 0.3)) { + proxy.scrollTo(newCategory, anchor: .center) + } + } + } + } + + private func countForCategory(_ category: SearchCategory) -> Int { + switch category { + case .all: + return musicCount + movieCount + podcastCount + etcCount + case .music: + return musicCount + case .movies: + return movieCount + case .podcast: + return podcastCount + case .etc: + return etcCount + } + } +} + +struct CategoryTab: View { + let category: SearchCategory + let isSelected: Bool + let count: Int + let onTap: () -> Void + + var body: some View { + Button(action: onTap) { + HStack(spacing: 6) { + Text(category.rawValue) + .font(.pretendardFont(family: isSelected ? .semiBold : .medium, size: 16)) + + if count > 0 { + Text("\(count)") + .font(.pretendardFont(family: .medium, size: 14)) + .foregroundStyle(isSelected ? .black : .gray) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(isSelected ? .green : .gray.opacity(0.3)) + ) + } + } + .foregroundStyle(isSelected ? .black : .gray) + .padding(.horizontal, 16) + .padding(.vertical, 10) + .background( + RoundedRectangle(cornerRadius: 20, style: .continuous) + .fill(isSelected ? .green : .clear) + .overlay( + RoundedRectangle(cornerRadius: 20, style: .continuous) + .stroke(isSelected ? .green : .gray.opacity(0.3), lineWidth: 1) + ) + ) + } + .buttonStyle(PlainButtonStyle()) + } +} + +#Preview { + VStack(spacing: 20) { + SearchCategoryFilter( + selectedCategory: .all, + musicCount: 15, + movieCount: 3, + podcastCount: 1, + etcCount: 2 + ) + + SearchCategoryFilter( + selectedCategory: .music, + musicCount: 15, + movieCount: 3, + podcastCount: 1, + etcCount: 2 + ) + } + .background(Color.black) +} \ No newline at end of file diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultItem.swift b/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultItem.swift new file mode 100644 index 0000000..fe1ca77 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultItem.swift @@ -0,0 +1,79 @@ +// +// SearchResultItem.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem +import Core +import Shared + +struct SearchResultItem: View { + let musicItem: MusicItem + var onTap: () -> Void = {} + + var body: some View { + HStack(spacing: 12) { + // 앨범 아트워크 + AsyncImage( + url: musicItem.artworkURL, + transaction: Transaction(animation: .easeInOut(duration: 0.25)) + ) { phase in + switch phase { + case .empty: + SkeletonView(width: 60, height: 60, cornerRadius: 8) + + case .success(let image): + image + .resizable() + .interpolation(.high) + .aspectRatio(1, contentMode: .fill) + .frame(width: 60, height: 60) + .clipped() + + case .failure: + RoundedRectangle(cornerRadius: 8) + .fill(Color.gray.opacity(0.3)) + .frame(width: 60, height: 60) + .overlay( + Image(systemName: "music.note") + .font(.system(size: 20)) + .foregroundColor(.gray) + ) + + @unknown default: + Color.clear + } + } + .clipShape(RoundedRectangle(cornerRadius: 8)) + + // 음악 정보 + VStack(alignment: .leading, spacing: 4) { + Text(musicItem.trackName) + .font(.pretendardFont(family: .semiBold, size: 16)) + .foregroundStyle(.white) + .lineLimit(1) + + Text(musicItem.artist) + .font(.pretendardFont(family: .medium, size: 14)) + .foregroundStyle(.textSecondary) + .lineLimit(1) + + Text(musicItem.album) + .font(.pretendardFont(family: .regular, size: 12)) + .foregroundStyle(.gray) + .lineLimit(1) + } + + Spacer() + + } + .padding(.horizontal, 20) + .padding(.vertical, 8) + .contentShape(Rectangle()) + .onTapGesture(perform: onTap) + } +} + diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultsList.swift b/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultsList.swift new file mode 100644 index 0000000..0d60717 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/SearchResultsList.swift @@ -0,0 +1,27 @@ +// +// SearchResultsList.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem +import Core + +struct SearchResultsList: View { + let searchResults: [MusicItem] + var onTapMusicItem: (MusicItem) -> Void = { _ in } + + var body: some View { + LazyVStack(spacing: 0) { + ForEach(searchResults) { musicItem in + SearchResultItem(musicItem: musicItem) { + onTapMusicItem(musicItem) + } + .background(.clear) + } + } + } +} + diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/TrendingCard.swift b/Projects/Presentation/Search/Sources/Main /View/Component/TrendingCard.swift new file mode 100644 index 0000000..2ae3f03 --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/TrendingCard.swift @@ -0,0 +1,48 @@ +// +// TrendingCard.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem +import Entity + +public struct TrendingCard: View { + private let item: TrendingItem + + public init( + item: TrendingItem + ) { + self.item = item + } + + public var body: some View { + ZStack(alignment: .topLeading) { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(.neutralBlack) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke(Color.black.opacity(0.06)) + ) + .shadow(color: .black.opacity(0.12), radius: 10, x: 0, y: 4) + + VStack(alignment: .leading, spacing: 10) { + Image(systemName: "chart.line.uptrend.xyaxis") + .font(.pretendardFont(family: .semiBold, size: 18)) + .foregroundStyle(.green) + + Spacer(minLength: 0) + + Text(item.title) + .font(.pretendardFont(family: .semiBold, size: 16)) + .foregroundStyle(.white) + } + .padding(16) + } + .frame(height: 92) + .contentShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + } +} + diff --git a/Projects/Presentation/Search/Sources/Main /View/Component/TrendingSection.swift b/Projects/Presentation/Search/Sources/Main /View/Component/TrendingSection.swift new file mode 100644 index 0000000..aa567ed --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/Component/TrendingSection.swift @@ -0,0 +1,56 @@ +// +// TrendingSection.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import DesignSystem +import Entity + +struct TrendingSection: View { + let items: [TrendingItem] = [ + TrendingItem(title: "Top Charts"), + TrendingItem(title: "New Releases"), + TrendingItem(title: "Podcasts"), + TrendingItem(title: "Movies") + ] + + // 필요 시 외부에서 주입해도 됨 + var onTap: (TrendingItem) -> Void = { _ in } + + // 카드 2열 그리드 + private let columns = [ + GridItem(.flexible(), spacing: 12), + GridItem(.flexible(), spacing: 12) + ] + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 8) { + Image(systemName: "chart.line.uptrend.xyaxis") + .font(.pretendardFont(family: .semiBold, size: 16)) + .foregroundStyle(.green) + + Text("Trending") + .font(.pretendardFont(family: .semiBold, size: 18)) + .foregroundStyle(.white) + } + .padding(.horizontal, 4) + + Spacer() + .frame(height: 5) + + LazyVGrid(columns: columns, spacing: 12) { + ForEach(items) { item in + TrendingCard(item: item) + .onTapGesture { onTap(item) } + } + } + } + .padding(16) + .background(Color.clear) + } +} + diff --git a/Projects/Presentation/Search/Sources/Main /View/SearchView.swift b/Projects/Presentation/Search/Sources/Main /View/SearchView.swift new file mode 100644 index 0000000..f302a8f --- /dev/null +++ b/Projects/Presentation/Search/Sources/Main /View/SearchView.swift @@ -0,0 +1,115 @@ +// +// SearchView.swift +// Search +// +// Created by Wonji Suh on 10/27/25. +// + +import SwiftUI +import ComposableArchitecture +import Shared + +public struct SearchView: View { + @Perception.Bindable public var store: StoreOf + + public init(store: StoreOf) { + self.store = store + } + + public var body: some View { + WithPerceptionTracking { + ZStack { + SearchBackground() + .ignoresSafeArea() + + VStack(spacing: 0) { + // 고정된 검색바와 Cancel 버튼 + HStack(spacing: 12) { + SearchBar( + searchText: store.searchText, + onTextChange: { text in + store.send(.view(.searchTextChanged(text))) + }, + onSearchSubmit: { searchText in + store.send(.view(.searchSubmitted(searchText))) + }, + onClearSearch: { + store.send(.view(.clearSearch)) + } + ) + + // Cancel 버튼 + if !store.searchText.isEmpty || !store.currentSearchQuery.isEmpty { + Button(action: { + store.send(.view(.clearSearch)) + }) { + Text("Cancel") + .font(.pretendardFont(family: .medium, size: 16)) + .foregroundStyle(.green) + } + .buttonStyle(PlainButtonStyle()) + .padding(.trailing, 16) + } + } + .padding(.top, 8) + + // 검색을 했을 때 카테고리 필터 표시 + if !store.currentSearchQuery.isEmpty { + SearchCategoryFilter( + selectedCategory: store.selectedCategory, + musicCount: store.musicCount, + movieCount: store.movieCount, + podcastCount: store.podcastCount, + etcCount: store.etcCount, + onCategorySelect: { category in + store.send(.view(.selectCategory(category))) + } + ) + .padding(.top, 12) + } + + // 스크롤 가능한 컨텐츠 + ScrollView { + VStack(spacing: 24) { + if !store.filteredSearchResults.isEmpty { + SearchResultsList( + searchResults: store.filteredSearchResults, + onTapMusicItem: { musicItem in + store.send(.navigation(.selectMusicItem(musicItem))) + } + ) + } else if !store.currentSearchQuery.isEmpty && store.allSearchResults.isEmpty { + NoResultsView(searchQuery: store.currentSearchQuery) { suggestion in + store.send(.view(.selectRecentSearch(suggestion))) + } + } else if !store.allSearchResults.isEmpty && store.filteredSearchResults.isEmpty { + NoResultsView(searchQuery: store.currentSearchQuery) { suggestion in + store.send(.view(.selectRecentSearch(suggestion))) + } + } else { + + RecentSearchesSection( + recentSearches: store.recentSearches, + onTapSearch: { searchText in + store.send(.view(.selectRecentSearch(searchText))) + } + ) + + TrendingSection( + onTap: { trendingItem in + store.send(.view(.selectTrendingItem(trendingItem.title))) + } + ) + } + + Spacer(minLength: 100) + } + .padding(.top, 16) + } + .scrollIndicators(.hidden) + .scrollBounceBehavior(.basedOnSize) + } + } + } + } +} diff --git a/README.md b/README.md index e0d4469..8cf7338 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,17 @@ Data/Repository implements DataInterface ``` ### Tuist graph -graph +graph + + +## 📸 구현 미리보기 + +| 홈 메인 | 검색 상세 | +| --- | --- | +| ![Home](Docs/Screenshots/home.png) | ![Search](Docs/Screenshots/search.png) | + +> 스크린샷은 `Docs/Screenshots` 디렉터리에 저장되어 있으며, 최신 UI 상태에 맞춰 교체할 수 있습니다. + ## 개발 환경 @@ -125,6 +135,49 @@ Data/Repository implements DataInterface - **WeaveDI**: 의존성 주입 - **SwiftLint**: 코드 스타일 체크 +## 설계 및 의사결정 기록 + +### 모듈화 & Clean Architecture +- Domain/Data/Presentation을 독립 모듈로 분리하여 의존성 역전과 테스트 용이성을 확보했습니다. +- 각 레이어는 Protocol 기반 인터페이스로만 연결하여 구현체 교체가 자유롭습니다. + +### 상태 관리: Composable Architecture +- 비동기 작업과 사이드이펙트를 Reducer/Effect로 통일해 화면 간 일관된 패턴을 유지했습니다. +- TestStore 기반 단위 테스트를 통해 onAppear, 검색, 탭 전환 등 주요 시나리오를 검증합니다. + +### 네트워킹 & 데이터 흐름 +- `AsyncMoya` 조합으로 iTunes API를 호출하고, DTO → Domain 매핑을 통해 Presentation 의존성을 최소화했습니다. +- Repository는 DomainInterface를 구현하며, 테스트에서는 Mock Repository로 교체해 빠른 회귀 검증이 가능합니다. + +### 의존성 주입: WeaveDI +- KeyPath 기반 등록으로 모듈 간 결합도를 낮추고, 테스트 환경에서 Mock을 손쉽게 주입할 수 있게 했습니다. +- Shared 모듈의 `@AutoSyncExtension`을 통해 TCA Environment와 DI 컨테이너를 자연스럽게 연결했습니다. + +### UI & 내비게이션 전략 +- `TCACoordinators`로 루트 탭과 상세 화면 전환을 구성하여 화면 상태를 명확히 추적합니다. +- `Shared/DesignSystem`에서 공통 UI 자산을 관리해 피처 모듈이 비즈니스 로직에 집중하도록 했습니다. + +## 추가 구현 사항 + +- **계절별 자동 로딩**: 홈 진입 시 5개의 시즌 곡을 병렬로 가져와 최신 순 정렬 후 중복 제거. +- **검색 카테고리 통계**: 전체/음악/영화/팟캐스트/기타 탭별 결과 수를 실시간 표시. +- **최근/추천 검색 흐름**: 최근 검색어 관리 및 Trending 항목을 통해 원탭 재검색 지원. +- **상세 공유 상태**: 홈과 검색에서 선택한 곡을 Shared Storage로 보존해 Detail 화면에서 즉시 활용. +- **테스트 강화**: Reducer 테스트로 에러 처리, 정렬, 카운트 로직 등을 회귀 검증. + +## 메모리 관리 분석 + +- **도구**: Xcode Instruments의 *Leaks*와 *Allocations*를 활용했습니다. +- **점검 절차** + 1. 홈 → 검색 → 상세 → 뒤로 이동 흐름을 반복 실행하면서 Allocations 그래프를 확인했습니다. + 2. Reducer/UseCase/Repository 인스턴스의 Retain Count가 화면 이탈 후 안정적으로 감소하는지 체크했습니다. + 3. Leaks 세션을 녹화하여 비동기 `Effect.run` 및 DI 등록부에서 순환 참조가 발생하지 않는지 조사했습니다. +- **결과** + - 누수 및 순환 참조가 검출되지 않았습니다. Reducer 내부 비동기 작업은 `await send` 후 종료되어 self 캡처를 남기지 않습니다. + - Repository/UseCase는 값 타입 또는 단순 클래스이므로 추가적인 `weak` 처리 없이도 회수되었습니다. +- **향후 가이드** + - 새 피처 추가 시 Instruments 세션을 재실행해 메모리 안정성을 주기적으로 확인하는 것을 권장합니다. + ## 🏗 Clean Architecture 설계 ### 🎯 인터페이스 분리 설계 @@ -256,4 +309,3 @@ swiftc TuistTool.swift -o tuisttool - 입력 받은 의존성들을 `Projects///Project.swift`의 `dependencies: [` 영역에 자동 삽입합니다. - Domain 계층 생성 시, `Interface/Sources/Base.swift`를 템플릿으로 생성하도록 선택 가능. - diff --git a/graph.png b/graph.png index ffa4c21..8cd06a7 100644 Binary files a/graph.png and b/graph.png differ