add c wrapper

This commit is contained in:
patrick-zippenfenig 2022-08-06 20:54:40 +02:00
parent 0b88a98474
commit f58408cb4e
8 changed files with 65 additions and 10 deletions

View file

@ -21,7 +21,8 @@ let package = Package(
.target(name: "CZoneDetect"),
.target(
name: "SwiftTimeZoneLookup",
dependencies: ["CZoneDetect"]),
dependencies: ["CZoneDetect"],
resources: [.process("Resources")]),
.testTarget(
name: "SwiftTimeZoneLookupTests",
dependencies: ["SwiftTimeZoneLookup"]),

View file

@ -1,3 +1,17 @@
# SwiftTimeZoneLookup
A description of this package.
## Build database
```bash
brew install shapelib wget
cd Submodules/ZoneDetect/database/builder
# make sure to select to newest version in make.db script
LIBRARY_PATH=/opt/homebrew/Cellar/shapelib/1.5.0/lib CPATH=/opt/homebrew/Cellar/shapelib/1.5.0/include ./makedb.sh
cp out_v1/timezone* ../../../../Sources/SwiftTimeZoneLookup/Resources
```

View file

@ -1 +1 @@
#include "../src/timezonedetect.h"
#include "../src/zonedetect.h"

View file

@ -0,0 +1,5 @@
Database version 2021c
Generated on 2022-08-07
https://github.com/evansiroky/timezone-boundary-builder/releases/tag/2021c

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,40 @@
public struct SwiftTimeZoneLookup {
public private(set) var text = "Hello, World!"
@_implementationOnly import CZoneDetect
import Foundation
public init() {
public enum SwiftTimeZoneLookupError: Error {
case couldNotFindTimezone21bin
case couldNotOpenDatabase
}
public final class SwiftTimeZoneLookup {
private let database: OpaquePointer
public init() throws {
guard let timezone21 = Bundle.module.url(forResource: "timezone21", withExtension: "bin") else {
throw SwiftTimeZoneLookupError.couldNotFindTimezone21bin
}
guard let database = timezone21.withUnsafeFileSystemRepresentation({ timezone21 in
ZDOpenDatabase(timezone21)
}) else {
throw SwiftTimeZoneLookupError.couldNotOpenDatabase
}
self.database = database
print(timezone21)
}
public func lookup(latitude: Float, longitude: Float) -> String {
guard let cTimezone = ZDHelperSimpleLookupString(database, latitude, longitude) else {
fatalError()
}
let timezone = String(cString: cTimezone)
ZDHelperSimpleLookupStringFree(cTimezone)
return timezone
}
deinit {
ZDCloseDatabase(database)
}
}

View file

@ -2,10 +2,11 @@ import XCTest
@testable import SwiftTimeZoneLookup
final class SwiftTimeZoneLookupTests: XCTestCase {
func testExample() throws {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct
// results.
XCTAssertEqual(SwiftTimeZoneLookup().text, "Hello, World!")
func testLookup() throws {
let database = try SwiftTimeZoneLookup()
XCTAssertEqual(database.lookup(latitude: 47.5, longitude: 8.6), "Europe/Zurich")
XCTAssertEqual(database.lookup(latitude: 47.5, longitude: -2.6), "Europe/Paris")
XCTAssertEqual(database.lookup(latitude: 47.5, longitude: -8.6), "Etc/GMT+1")
XCTAssertEqual(database.lookup(latitude: 42.5, longitude: -8.6), "Europe/Madrid")
}
}