A Swift package for building capabilities for Spatio, with support for local and remote API integrations.
SpatioSDK provides the core models and utilities needed for creating capabilities that interact with remote APIs:
- API parameter models and request handling
- Flexible authentication configuration
- Command line argument parsing
- Capability result formatting
- Mock data support for testing
dependencies: [
.package(url: "https://github.com/spatio-labs/spatiosdk.git", .upToNextMajor(from: "1.0.0"))
]#!/usr/bin/env swift sh
import SpatioSDK // @spatio-labs ~> 1.0.0Initialize the SDK with your configuration:
import SpatioSDK
// Configure the SDK with custom settings
let config = SpatioConfig(
loggingLevel: .debug,
useMockData: false,
baseURL: URL(string: "https://api.example.com")
)
SpatioSDK.shared.configure(with: config)SpatioSDK provides a flexible authentication system that supports:
- Multiple authentication types (API key, OAuth2, Basic, etc.)
- Configuration at organization, group, or capability level
- Environment variable-based secret storage
Authentication can be configured at three levels:
- Organization level - Applies to all capabilities in an organization
- Group level - Applies to all capabilities in a group
- Capability level - Applies to a specific capability
More specific configurations override less specific ones.
// Configure OAuth2 for all Google services
let googleOAuth = AuthConfig(
type: .oauth2,
parameterName: "Authorization",
location: .header,
valuePrefix: "Bearer ",
envVariable: "GOOGLE_AUTH_TOKEN"
)
// Set at organization level
AuthManager.shared.setAuthConfig(for: "google", config: googleOAuth)
// Override for a specific group if needed
let apiKeyConfig = AuthConfig(
type: .apiKey,
parameterName: "api_key",
location: .query,
envVariable: "MY_SERVICE_API_KEY"
)
AuthManager.shared.setAuthConfig(for: "google", group: "maps", config: apiKeyConfig)- Create a Swift script using swift-sh that imports SpatioSDK:
#!/usr/bin/env swift sh
import SpatioSDK // @spatio-labs ~> 1.0.0
import Foundation
// Configure authentication
func configureAuth() {
let authConfig = AuthConfig(
type: .apiKey,
parameterName: "Authorization",
location: .header,
valuePrefix: "Bearer ",
envVariable: "API_AUTH_TOKEN"
)
AuthManager.shared.setAuthConfig(for: "myorg", config: authConfig)
}
// Implement the capability
class MyApiCapability: BaseRemoteCapability {
override func configureRequest() -> APIRequest {
return APIRequest(
baseURL: "https://api.example.com",
endpoint: "/resource",
method: "GET",
parameters: [
APIParameter(
name: "query",
type: "string",
required: true,
location: .query,
description: "Search query"
)
]
)
}
// Override to provide custom mock data (optional)
override func provideMockData(for params: [String: String]) -> String {
return """
{
"mock": true,
"query": "\(params["query"] ?? "")",
"results": [
{"id": 1, "name": "Result 1"},
{"id": 2, "name": "Result 2"}
]
}
"""
}
}
// Parse command line arguments
@main
struct MyCapabilityScript {
static func main() async throws {
// Configure auth
configureAuth()
// Create capability with identifiers
let capability = MyApiCapability(
organization: "myorg",
group: "mygroup",
capability: "MyCapability"
)
// Parse command line arguments
let params = CommandLineUtils.parseArguments(for: capability.request.parameters)
// Execute the capability
let result = try await capability.execute(params: params)
CommandLineUtils.printResult(result)
}
}- Make the script executable: