-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOverpass.swift
45 lines (38 loc) · 1.2 KB
/
Overpass.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//
// Overpass.swift
// OverpassKit
//
// Created by Lucka on 24/9/2024.
//
import Foundation
public actor Overpass {
private let api: URL
public init(api: URL = Overpass.defaultAPI) {
self.api = api
}
}
public extension Overpass {
static let defaultAPI = URL(string: "https://overpass-api.de/api/interpreter")!
@inlinable func query<Element: Decodable, Content: QueryContent>(
_ type: Element.Type, @QueryBuilder query: @escaping () -> Content
) async throws -> [ Element ] {
return try await self.query(query: query)
}
func query<Element: Decodable, Content: QueryContent>(
@QueryBuilder query: @escaping () -> Content
) async throws -> [ Element ] {
let url = api.appending(
queryItems: [
.init(
name: "data",
value: "[out:json]; \(query().content)"
)
]
)
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(OverpassOutput<Element>.self, from: data).elements
}
}
fileprivate struct OverpassOutput<Element: Decodable> : Decodable {
var elements: [ Element ]
}