diff --git a/Libraries/Package.swift b/Libraries/Package.swift index 99713d6..8e572f0 100644 --- a/Libraries/Package.swift +++ b/Libraries/Package.swift @@ -8,11 +8,16 @@ let package = Package( products: [ .library( name: "Libraries", - targets: ["APIService"]), + targets: [ + "APIService", + "DependencyService" + ] + ), ], dependencies: [], targets: [ .target(name: "APIService"), + .target(name: "DependencyService"), .testTarget( name: "APIServiceTests", dependencies: ["APIService"] diff --git a/Libraries/Sources/DependencyService/Property Wrappers/Dependency.swift b/Libraries/Sources/DependencyService/Property Wrappers/Dependency.swift new file mode 100644 index 0000000..d8f21fd --- /dev/null +++ b/Libraries/Sources/DependencyService/Property Wrappers/Dependency.swift @@ -0,0 +1,29 @@ +// +// Dependency.swift +// DependencyService +// +// Created by Javier Cicchelli on 05/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +@propertyWrapper +public struct Dependency { + + // MARK: Properties + + private let keyPath: WritableKeyPath + + // MARK: Computed + + public var wrappedValue: D { + get { DependencyStore[keyPath] } + set { DependencyStore[keyPath] = newValue } + } + + // MARK: Initialisers + + public init(_ keyPath: WritableKeyPath) { + self.keyPath = keyPath + } + +} diff --git a/Libraries/Sources/DependencyService/Protocols/DependencyKey.swift b/Libraries/Sources/DependencyService/Protocols/DependencyKey.swift new file mode 100644 index 0000000..da0254c --- /dev/null +++ b/Libraries/Sources/DependencyService/Protocols/DependencyKey.swift @@ -0,0 +1,19 @@ +// +// DependencyKey.swift +// DependencyService +// +// Created by Javier Cicchelli on 05/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +public protocol DependencyKey { + + // MARK: Associated types + + associatedtype Value + + // MARK: Properties + + static var currentValue: Value { get set } + +} diff --git a/Libraries/Sources/DependencyService/Structs/DependencyStore.swift b/Libraries/Sources/DependencyService/Structs/DependencyStore.swift new file mode 100644 index 0000000..88ad1e0 --- /dev/null +++ b/Libraries/Sources/DependencyService/Structs/DependencyStore.swift @@ -0,0 +1,27 @@ +// +// DependencyStore.swift +// DependencyService +// +// Created by Javier Cicchelli on 05/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +public struct DependencyStore { + + // MARK: Properties + + private static var current = Self() + + // MARK: Functions + + public static subscript(key: K.Type) -> K.Value where K: DependencyKey { + get { key.currentValue } + set { key.currentValue = newValue } + } + + public static subscript(_ keyPath: WritableKeyPath) -> D { + get { current[keyPath: keyPath] } + set { current[keyPath: keyPath] = newValue } + } + +}