Zarządzanie różnymi środowiskami API (dev, staging, production).
import rip.nerd.kitsunenet.config.KNETEnvironment
val environment = KNETEnvironment.create {
// Development
env("dev") {
baseUrl = "https://dev-api.example.com"
debug = true
logLevel = LogLevel.BODY
timeout = 60_000
}
// Staging
env("staging") {
baseUrl = "https://staging-api.example.com"
debug = true
logLevel = LogLevel.HEADERS
}
// Production
env("prod") {
baseUrl = "https://api.example.com"
debug = false
logLevel = LogLevel.NONE
timeout = 30_000
sslPinning = true
}
// Domyślne
current = BuildConfig.DEBUG.let { if (it) "dev" else "prod" }
}
// Pobierz aktualny base URL
val baseUrl = environment.baseUrl
// https://dev-api.example.com
// Buduj URL
val usersUrl = environment.url("/users")
// https://dev-api.example.com/users
// Przełącz środowisko
environment.switch("staging")
// Sprawdź
if (environment.isDev) {
showDebugPanel()
}
if (environment.isProd) {
disableDebugFeatures()
}
val client = KNETClient.builder()
.baseUrl(environment.baseUrl)
.debug(environment.debug)
.addInterceptor(
if (environment.debug) KNETLoggingInterceptor() else null
)
.sslPinning(
if (environment.sslPinning) productionPinning else null
)
.build()
// Automatyczne przebudowanie przy zmianie env
environment.onChange { newEnv ->
rebuildClient()
}
val environment = KNETEnvironment.create {
env("dev") {
baseUrl = "https://dev-api.example.com"
set("api_key", "dev-key-123")
set("analytics_enabled", false)
set("mock_payments", true)
}
env("prod") {
baseUrl = "https://api.example.com"
set("api_key", BuildConfig.API_KEY)
set("analytics_enabled", true)
set("mock_payments", false)
}
}
// Użycie
val apiKey = environment.get<String>("api_key")
val mockPayments = environment.get<Boolean>("mock_payments") ?: false
@Composable
fun EnvironmentSwitcher(environment: KNETEnvironment) {
if (!BuildConfig.DEBUG) return
var expanded by remember { mutableStateOf(false) }
Column {
Text("Environment: ${environment.current}")
Button(onClick = { expanded = !expanded }) {
Text("Change")
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
environment.availableEnvironments.forEach { env ->
DropdownMenuItem(
text = { Text(env) },
onClick = {
environment.switch(env)
expanded = false
}
)
}
}
}
}