{"id":40013756,"url":"https://github.com/fabio914/swift-wiring","last_synced_at":"2026-01-19T03:01:00.941Z","repository":{"id":331937249,"uuid":"1123875956","full_name":"fabio914/swift-wiring","owner":"fabio914","description":"Compile-time safe Automatic Dependency Injection for Swift","archived":false,"fork":false,"pushed_at":"2026-01-11T19:03:30.000Z","size":96,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T20:30:56.203Z","etag":null,"topics":["compile-time-checking","dependency-injection","ios","macos","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fabio914.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-27T20:23:43.000Z","updated_at":"2026-01-11T19:03:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fabio914/swift-wiring","commit_stats":null,"previous_names":["fabio914/swift-wiring"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/fabio914/swift-wiring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabio914%2Fswift-wiring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabio914%2Fswift-wiring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabio914%2Fswift-wiring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabio914%2Fswift-wiring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fabio914","download_url":"https://codeload.github.com/fabio914/swift-wiring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabio914%2Fswift-wiring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28559345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T00:46:33.223Z","status":"online","status_checked_at":"2026-01-19T02:00:08.049Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compile-time-checking","dependency-injection","ios","macos","swift"],"created_at":"2026-01-19T03:00:54.623Z","updated_at":"2026-01-19T03:01:00.900Z","avatar_url":"https://github.com/fabio914.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"Images/logo.png\" width=\"100\" /\u003e\n\n# Swift Wiring\n\nThis is a command line tool for compile-time Automatic Dependency Injection for [Swift](https://www.swift.org).\n\nIt reads `sw:` annotations in the Swift source code and generates `Container`s with your resolved dependencies.\n\n**Attention:** This tool is still in active development and is **experimental**. I don't recommend adopting it in your project yet. \nCheck the TO-DO list below for some of the things that still need to be implemented.\n\n## Why?\n\nMost automatic dependency injection tools for Swift either only work in runtime and provide no compile-time guarantee. Other compile-time tools require changes to the code, and require the project to use specific Swift Macros and use Swift Package Manager.\n\nSwift Wiring doesn't modify the existing code, and it doesn't require any other code dependencies to be added to your project.\n\nIt aims to be:\n\n* **Non-intrusive**\n\n  - All of its annotations and commands live in comments.\n\n\n* **Additive**\n\n  - It does not modify your existing source code, and it only generates new code.\n\n* **Simple**\n\n  - It has only a few commands.\n  - It won't check every error, so it relies on the Swift compiler to ultimately verify the generated Container code.\n  - The generated code is human-readable and can be debugged.\n\n## Documentation\n\n* [How to Setup](Docs/SETUP.md)\n* [Syntax and Commands](Docs/DOCUMENTATION.md)\n* [Example](Example/README.md)\n\n## Example\n\nNavigate to the `Example/` folder and use [XcodeGen](https://github.com/yonaskolb/XcodeGen) to generate an Xcode project of an iOS app that uses this tool.\n\n\u003cdetails\u003e\n\n\u003csummary\u003eExample Input\u003c/summary\u003e\n\n```swift\nimport Foundation\n\n// sw: container(MyContainer) {\n//   access(public)\n//\n//   singleton(SessionManager)\n//   singleton(UserManager) { access(public) }\n//\n//   singleton(UserDataPersistence, PersistenceProtocol) { name(User) }\n//   singleton(SessionDataPersistence, PersistenceProtocol) { name(Session) }\n//\n//   build(NetworkManager, NetworkManagerProtocol)\n//   build(AuthNetworkManager, NetworkManagerProtocol) { name(Authenticated) }\n//\n//   build(LoggedOutApi) { access(public) }\n//   build(OtherApi, ApiClient) { access(public) name(Other) }\n//   build(UserInfoApi, ApiClient) { name(User) }\n//\n//   build(providesUserName) { name(UserName) }\n//   build(providesUserEmail, String) { name(UserEmail) }\n//   build(UserViewModel)\n// }\nprotocol MyContainerProtocol {\n}\n\npublic protocol ApiClient {}\n\nprotocol SomethingExternal {}\n\n// sw: inject\nfinal class LoggedOutApi: ApiClient {\n    let networkManager: NetworkManagerProtocol\n    let something: SomethingExternal\n    let parameter: String\n\n    init(\n        // sw: dependency\n        networkManager: NetworkManagerProtocol,\n        // sw: dependency\n        something: SomethingExternal,\n        parameter: String\n    ) {\n        self.networkManager = networkManager\n        self.something = something\n        self.parameter = parameter\n    }\n}\n\n// sw: inject\nfinal class OtherApi: ApiClient {\n    let networkManager: NetworkManagerProtocol\n\n    init(\n        // sw: dependency\n        networkManager: NetworkManagerProtocol\n    ) {\n        self.networkManager = networkManager\n    }\n}\n\n// sw: inject\nfinal class UserInfoApi: ApiClient {\n    let authNetworkManager: NetworkManagerProtocol\n    \n    init(\n        // sw: dependency(Authenticated)\n        authNetworkManager: NetworkManagerProtocol\n    ) {\n        self.authNetworkManager = authNetworkManager\n    }\n}\n\nprotocol NetworkManagerProtocol {\n    func perform(request: URLRequest) async throws -\u003e Data\n}\n\n// sw: inject\nfinal class NetworkManager: NetworkManagerProtocol {\n    init() {}\n\n    func perform(request: URLRequest) async throws -\u003e Data {\n        Data()\n    }\n}\n\n// sw: inject\nfinal class AuthNetworkManager: NetworkManagerProtocol {\n    let sessionManager: SessionManager\n\n    init(/* sw: dependency */ sessionManager: SessionManager) {\n        self.sessionManager = sessionManager\n    }\n\n    func perform(request: URLRequest) async throws -\u003e Data {\n        Data()\n    }\n}\n\n// sw: inject\npublic final class UserManager {\n    let persistence: PersistenceProtocol\n    let apiClient: ApiClient\n    let sessionManager: SessionManager\n    let userName: String\n    let userEmail: String\n\n    init(\n        /* sw: dependency(User) */ persistence: PersistenceProtocol,\n        /* sw: dependency(User) */ apiClient: ApiClient,\n        /* sw: dependency */ sessionManager: SessionManager\n    ) {\n        self.persistence = persistence\n        self.apiClient = apiClient\n        self.sessionManager = sessionManager\n        self.userName = \"Some name\"\n        self.userEmail = \"email@email.com\"\n    }\n}\n\n// sw: inject\nfinal class SessionManager {\n    let persistence: PersistenceProtocol\n\n    init(/* sw: dependency(Session) */ persistence: PersistenceProtocol) {\n        self.persistence = persistence\n    }\n}\n\nprotocol PersistenceProtocol {\n}\n\n// sw: inject\nfinal class SessionDataPersistence: PersistenceProtocol {\n    init() {}\n}\n\n// sw: inject\nfinal class UserDataPersistence: PersistenceProtocol {\n    init() {}\n}\n\n// sw: inject\nfunc providesUserName(\n    /* sw: dependency */ userManager: UserManager\n) -\u003e String {\n    userManager.userName\n}\n\n// sw: inject\nfunc providesUserEmail(\n    /* sw: dependency */ userManager: UserManager\n) -\u003e String {\n    userManager.userEmail\n}\n\n// sw: inject\nfinal class UserViewModel {\n    let userName: String\n    let userEmail: String\n\n    init(\n        /* sw: dependency(UserName) */ userName: String,\n        /* sw: dependency(UserEmail) */ userEmail: String\n    ) {\n        self.userName = userName\n        self.userEmail = userEmail\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eExample Output\u003c/summary\u003e\n\n```swift\nimport Foundation\n\npublic final class MyContainer: MyContainerProtocol {\n\n    public struct ExternalDependency\u003cT\u003e {\n        let closure: () -\u003e T\n        \n        init(closure: @escaping () -\u003e T) {\n            self.closure = closure\n        }\n        \n        public static func constant(_ value: T) -\u003e Self {\n            .init(closure: { value })\n        }\n        \n        public static func builder(_ closure: @escaping () -\u003e T) -\u003e Self {\n            .init(closure: closure)\n        }\n    }\n\n    let externalSomethingExternal: () -\u003e SomethingExternal\n\n    private(set) lazy var singletonSessionPersistenceProtocol: PersistenceProtocol = buildSessionPersistenceProtocol()\n\n    private(set) lazy var singletonUserPersistenceProtocol: PersistenceProtocol = buildUserPersistenceProtocol()\n\n    private(set) lazy var singletonSessionManager: SessionManager = buildSessionManager()\n\n    public private(set) lazy var singletonUserManager: UserManager = buildUserManager()\n\n    public init(\n        somethingExternal: ExternalDependency\u003cSomethingExternal\u003e\n    ) {\n        self.externalSomethingExternal = somethingExternal.closure\n    }\n\n    public func buildOtherApiClient() -\u003e ApiClient {\n        return OtherApi(\n            networkManager: self.buildNetworkManagerProtocol()\n        )\n    }\n\n    internal func buildUserApiClient() -\u003e ApiClient {\n        return UserInfoApi(\n            authNetworkManager: self.buildAuthenticatedNetworkManagerProtocol()\n        )\n    }\n\n    public func buildLoggedOutApi(\n        parameter: String\n    ) -\u003e LoggedOutApi {\n        return LoggedOutApi(\n            networkManager: self.buildNetworkManagerProtocol(),\n            something: self.externalSomethingExternal(),\n            parameter: parameter\n        )\n    }\n\n    internal func buildNetworkManagerProtocol() -\u003e NetworkManagerProtocol {\n        return NetworkManager(\n        )\n    }\n\n    internal func buildAuthenticatedNetworkManagerProtocol() -\u003e NetworkManagerProtocol {\n        return AuthNetworkManager(\n            sessionManager: self.singletonSessionManager\n        )\n    }\n\n    private func buildSessionPersistenceProtocol() -\u003e PersistenceProtocol {\n        return SessionDataPersistence(\n        )\n    }\n\n    private func buildUserPersistenceProtocol() -\u003e PersistenceProtocol {\n        return UserDataPersistence(\n        )\n    }\n\n    private func buildSessionManager() -\u003e SessionManager {\n        return SessionManager(\n            persistence: self.singletonSessionPersistenceProtocol\n        )\n    }\n\n    internal func buildUserEmailString() -\u003e String {\n        return providesUserEmail(\n            userManager: self.singletonUserManager\n        )\n    }\n\n    private func buildUserManager() -\u003e UserManager {\n        return UserManager(\n            persistence: self.singletonUserPersistenceProtocol,\n            apiClient: self.buildUserApiClient(),\n            sessionManager: self.singletonSessionManager\n        )\n    }\n\n    internal func buildUserViewModel() -\u003e UserViewModel {\n        return UserViewModel(\n            userName: self.buildUserNameString(),\n            userEmail: self.buildUserEmailString()\n        )\n    }\n\n    internal func buildUserNameString() -\u003e String {\n        return providesUserName(\n            userManager: self.singletonUserManager\n        )\n    }\n}\n```\n\n\u003c/details\u003e\n\n## TO-DOs\n\n - [ ] Add Scopes with a collection of containers;\n - [ ] Support actors and main actors;\n - [ ] Support multiple initializers;\n - [ ] Add tests;\n \n etc...\n\n## Credits\n\nDeveloped by Fabio de Albuquerque Dela Antonio.\n\nThis project relies heavily on [Swift Syntax](https://github.com/swiftlang/swift-syntax).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabio914%2Fswift-wiring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabio914%2Fswift-wiring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabio914%2Fswift-wiring/lists"}