33import Foundation
44import PackageDescription
55
6+ /* GENERATED BY SPMManifestTool BEGIN */
7+ /* DO NOT EDIT */
8+
9+ public protocol EnvironmentProvider {
10+ func value( forKey key: String ) -> String ?
11+ }
12+
13+ import PackageDescription
14+ public struct PackageContextEnvironmentProvider : EnvironmentProvider {
15+ public init ( ) { }
16+
17+ public func value( forKey key: String ) -> String ? {
18+ Context . environment [ key]
19+ }
20+ }
21+
622// MARK: - Env Manager
723
8- @MainActor
9- final class EnvManager {
10- static let shared = EnvManager ( )
24+ public final class EnvManager {
25+ nonisolated ( unsafe) public static let shared = EnvManager ( )
1126
1227 private var domains : [ String ] = [ ]
28+ private var environmentProvider : EnvironmentProvider
29+
30+ /// When true, append raw key as fallback when searching in domains
31+ public var includeFallbackToRawKey : Bool = false
1332
14- func register( domain: String ) {
33+ private init ( ) {
34+ self . environmentProvider = PackageContextEnvironmentProvider ( )
35+ }
36+
37+ /// Set a custom environment provider (useful for testing)
38+ public func setEnvironmentProvider( _ provider: EnvironmentProvider ) {
39+ self . environmentProvider = provider
40+ }
41+
42+ /// Reset domains and environment provider (useful for testing)
43+ public func reset( ) {
44+ domains. removeAll ( )
45+ includeFallbackToRawKey = false
46+ self . environmentProvider = PackageContextEnvironmentProvider ( )
47+ }
48+
49+ public func register( domain: String ) {
1550 domains. append ( domain)
1651 }
1752
18- func withDomain< T> ( _ domain: String , perform: ( ) throws -> T ) rethrows -> T {
53+ public func withDomain< T> ( _ domain: String , perform: ( ) throws -> T ) rethrows -> T {
1954 domains. append ( domain)
2055 defer { domains. removeAll { $0 == domain } }
2156 return try perform ( )
2257 }
2358
24- private func envValue< T> (
25- rawKey: String ,
26- default defaultValue: T ? ,
27- searchInDomain: Bool ,
28- parser: ( String ) -> T ?
29- ) -> T ? {
59+ private func envValue< T> ( rawKey: String , default defaultValue: T ? , searchInDomain: Bool , parser: ( String ) -> T ? ) -> T ? {
3060 func parseEnvValue( _ key: String ) -> ( String , T ) ? {
31- guard let value = Context . environment [ key] else {
32- return nil
33- }
34- guard let result = parser ( value) else {
35- return nil
36- }
61+ guard let value = environmentProvider. value ( forKey: key) ,
62+ let result = parser ( value) else { return nil }
3763 return ( value, result)
3864 }
39- let keys : [ String ] = searchInDomain
40- ? domains. map { " \( $0. uppercased ( ) ) _ \( rawKey) " }
41- : [ rawKey]
65+ var keys : [ String ] = searchInDomain ? domains. map { " \( $0. uppercased ( ) ) _ \( rawKey) " } : [ ]
66+ if !searchInDomain || includeFallbackToRawKey {
67+ keys. append ( rawKey)
68+ }
4269 for key in keys {
4370 if let ( value, result) = parseEnvValue ( key) {
4471 print ( " [Env] \( key) = \( value) -> \( result) " )
@@ -52,7 +79,7 @@ final class EnvManager {
5279 return defaultValue
5380 }
5481
55- func envBoolValue( rawKey: String , default defaultValue: Bool ? = nil , searchInDomain: Bool ) -> Bool ? {
82+ public func envBoolValue( rawKey: String , default defaultValue: Bool ? = nil , searchInDomain: Bool ) -> Bool ? {
5683 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { value in
5784 switch value {
5885 case " 1 " : true
@@ -62,37 +89,35 @@ final class EnvManager {
6289 }
6390 }
6491
65- func envIntValue( rawKey: String , default defaultValue: Int ? = nil , searchInDomain: Bool ) -> Int ? {
92+ public func envIntValue( rawKey: String , default defaultValue: Int ? = nil , searchInDomain: Bool ) -> Int ? {
6693 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { Int ( $0) }
6794 }
6895
69- func envStringValue( rawKey: String , default defaultValue: String ? = nil , searchInDomain: Bool ) -> String ? {
96+ public func envStringValue( rawKey: String , default defaultValue: String ? = nil , searchInDomain: Bool ) -> String ? {
7097 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { $0 }
7198 }
7299}
73- EnvManager . shared. register ( domain: " OpenAttributeGraph " )
74- EnvManager . shared. register ( domain: " OpenSwiftUI " )
75100
76- @MainActor
77- func envBoolValue( _ key: String , default defaultValue: Bool = false , searchInDomain: Bool = true ) -> Bool {
101+ public func envBoolValue( _ key: String , default defaultValue: Bool = false , searchInDomain: Bool = true ) -> Bool {
78102 EnvManager . shared. envBoolValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
79103}
80104
81- @MainActor
82- func envIntValue( _ key: String , default defaultValue: Int = 0 , searchInDomain: Bool = true ) -> Int {
105+ public func envIntValue( _ key: String , default defaultValue: Int = 0 , searchInDomain: Bool = true ) -> Int {
83106 EnvManager . shared. envIntValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
84107}
85108
86- @MainActor
87- func envStringValue( _ key: String , default defaultValue: String , searchInDomain: Bool = true ) -> String {
109+ public func envStringValue( _ key: String , default defaultValue: String , searchInDomain: Bool = true ) -> String {
88110 EnvManager . shared. envStringValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
89111}
90112
91- @MainActor
92- func envStringValue( _ key: String , searchInDomain: Bool = true ) -> String ? {
113+ public func envStringValue( _ key: String , searchInDomain: Bool = true ) -> String ? {
93114 EnvManager . shared. envStringValue ( rawKey: key, searchInDomain: searchInDomain)
94115}
95116
117+ /* GENERATED BY SPMManifestTool END */
118+ EnvManager . shared. register ( domain: " OpenAttributeGraph " )
119+ EnvManager . shared. register ( domain: " OpenSwiftUI " )
120+
96121// MARK: - Env and config
97122
98123#if os(macOS)
0 commit comments