🌍 Environment Manager

Zarządzanie różnymi środowiskami API (dev, staging, production).

Szybki start

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" }
}

Użycie

// 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()
}

Z KNETClient

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()
}

Zmienne per environment

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

UI do przełączania (Debug)

@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
                    }
                )
            }
        }
    }
}

📚 Zobacz też