URLRouter is provides an easy way to manage multiple URL endpoints in Swift.
It provides a simple interface for managing multiple endpoints and allows developers to interact with them in a single, unified manner.
It also provides a way for developers to create custom endpoints DSL(Domain-Specific Languages) and to manage their own settings for each endpoint.
Additionally, it provides a way to track the status of each endpoint and to easily detect any changes or updates that have been made.
Similar to Swift Evolution’s Regex builder DSL, URL string literal and a more powerful pattern result builder to help make Swift URL string processing fast and easy and without mistakes. Ultimately, with URLRouter, changes are easy to detect and useful for maintenance.
To implement URLs namespace we create a new type that will house the domain and behavior of the URLs by conforming to URLRoutable.
```swift
import URLRouter
struct RepositoryInfo {
let name: String
let description: String
let homePage: String
let private: Bool
let hasIssues: Bool
let hasProjects: Bool
let hasWiki: Bool
}
// example-deeplink://detail/comments?1=postId&2021-04-27T04:39:54.261Z=createdA
let deeplink = URLs.deeplink(path: “detail”).router.url
- Using ***URLRouter*** to provide `URLRequest`.
```swift
let repositoryInfo: URLs.RepositoryInfo = .init(name: "Hello-World", description: "This is your first repository", homePage: "https://github.com", private: false, hasIssues: true, hasProjects: true, hasWiki: false)
let request = URLs.createAnOrganizationRepository(organizationName: "SomeOrganization", repositoryInfo: repositoryInfo).router?.urlRequest
URLSession.shared.dataTask(with: request) { data, response, error in
...
Using URLRouter to provide deeplink URL and check to match this URL.
class AppDelegate: UIResponder, UIApplicationDelegate {
...
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
let detailDeeplink = URLs.deeplink(path: "detail").router.url
if detailDeeplink == url {
...
}
...
License
URLRouter is under MIT license. See the LICENSE file for more info.
What’s URLRouter 📟
URLRouter is provides an easy way to manage multiple URL endpoints in Swift. It provides a simple interface for managing multiple endpoints and allows developers to interact with them in a single, unified manner. It also provides a way for developers to create custom endpoints DSL(Domain-Specific Languages) and to manage their own settings for each endpoint. Additionally, it provides a way to track the status of each endpoint and to easily detect any changes or updates that have been made.
Similar to Swift Evolution’s Regex builder DSL, URL string literal and a more powerful pattern result builder to help make Swift URL string processing fast and easy and without mistakes. Ultimately, with URLRouter, changes are easy to detect and useful for maintenance.
🤔 Ask questions you’re wondering about here.
💡 Share ideas here.
Installation 📦
Using Swift Package Manager
Configure URLRouter 📝
Implement URLs Namespace
URLRoutable
. ```swift import URLRouterpublic enum URLs: URLRoutable { … }
Dictionary
tohttpHeader
declaration.HttpBody declaration
HeaderBuilder
tohttpHeader
declaration.Dictionary<String, Any>
tohttpHeader
declaration.HttpMethod declaration
Method(_ method:)
tohttpMethod
declaration.static let method:
tohttpMethod
declaration.URL declaration
URL(_ url:)
toURL
declaration.URLBuilder
toURL
declaration andURLComponents
declaration.BaseURL(_ url:)
forURL
override. ```swift Request { BaseURL(“https://www.baseurl.com") URL { Path(“comments”) Query(“postId”, value: “1”) } } // https://www.baseurl.com/comments?postId=1Router { BaseURL(“https://www.baseurl.com") Request { URL { Scheme(.https) Host(“www.overrideurl.com") Path(“comments”) Query(“postId”, value: “1”) } } } // https://www.overrideurl.com/comments?postId=1
static let scheme:
toScheme
declaration.URL Query declaration
Dictionary<String, String?>
toQuery
declaration.Query(_, value:)
toQuery
declaration.Field(_, forKey:)
toQuery
declaration.How to configure and use URLRouter in a real world project?
enum URLs: URLRoutable { // DOC: https://docs.github.com/ko/rest/repos/repos?apiVersion=2022-11-28#list-organization-repositories case listOrganizationRepositories(organizationName: String) // DOC: https://docs.github.com/ko/rest/repos/repos?apiVersion=2022-11-28#create-an-organization-repository case createAnOrganizationRepository(organizationName: String, repositoryInfo: RepositoryInfo) // DOC: https://docs.github.com/ko/rest/search?apiVersion=2022-11-28#search-repositories case searchRepositories(query: String) case deeplink(path: String = “home”)
struct RepositoryInfo { let name: String let description: String let homePage: String let
private
: Bool let hasIssues: Bool let hasProjects: Bool let hasWiki: Bool }var router: URLRouter { URLRouter { BaseURL(“http://api.github.com") switch self { case let .listOrganizationRepositories(organizationName): Request { Method.post Header { Field(“application/vnd.github+json”, forKey: “Accept”) Field(“Bearer“, forKey: “Authorization”)
Field(“2022-11-28”, forKey: “X-GitHub-Api-Version”)
}
URL {
Path(“orgs/(organizationName)/repos”)
}
}
case let .createAnOrganizationRepository(organizationName, repositoryInfo):
Request {
Method.post
Header {
Field(“application/vnd.github+json”, forKey: “Accept”)
Field(“Bearer “, forKey: “Authorization”)
Field(“2022-11-28”, forKey: “X-GitHub-Api-Version”)
}
URL {
Path(“orgs/(organizationName)/repos”)
}
Body {
Field(repositoryInfo.name, forKey: “name”)
Field(repositoryInfo.description, forKey: “description”)
Field(repositoryInfo.homePage, forKey: “homepage”)
Field(repositoryInfo.private, forKey: “private”)
Field(repositoryInfo.hasIssues, forKey: “has_issues”)
Field(repositoryInfo.hasProjects, forKey: “has_projects”)
Field(repositoryInfo.hasWiki, forKey: “has_wiki”)
}
}
case let .searchRepositories(query):
Request {
Method.get
Header {
Field(“application/vnd.github+json”, forKey: “Accept”)
Field(“Bearer “, forKey: “Authorization”)
Field(“2022-11-28”, forKey: “X-GitHub-Api-Version”)
}
URL {
Path(“search/repositories”)
Query(“q”, value: query)
}
}
case let .deeplink(path):
URL {
Scheme.custom(“example-deeplink”)
Host(“detail”)
Path(path)
Query {
Field(“postId”, forKey: “1”)
Field(“createdAt”, forKey: “2021-04-27T04:39:54.261Z”)
}
}
}
}
}
}
// http://api.github.com/orgs/organization/repos let listOrganizationRepositoriesUrl = URLs.listOrganizationRepositories(organizationName: “organization”).router?.urlRequest?.url
// http://api.github.com/search/repositories?q=urlrouter let searchRepositoriesUrl = URLs.searchRepositories(query: “urlrouter”).router?.urlRequest?.url
// example-deeplink://detail/comments?1=postId&2021-04-27T04:39:54.261Z=createdA let deeplink = URLs.deeplink(path: “detail”).router.url
URL
and check to match thisURL
.License
URLRouter is under MIT license. See the LICENSE file for more info.