import { Config, ConfigProvider, Effect, Layer, Schema } from "effect" import * as Context from "effect/Context" import { Resource } from "sst/resource" export class AppConfigValue extends Schema.Class("AppConfigValue")({ stage: Schema.NonEmptyString, publicUrl: Schema.NonEmptyString, }) {} const decodeAppConfigValue = Schema.decodeUnknownSync(AppConfigValue) const config = Config.all({ stage: Config.succeed(Resource.App.stage), publicUrl: Config.string("PUBLIC_URL").pipe(Config.withDefault("http://localhost:3000")), }).pipe(Config.map(decodeAppConfigValue)) export class AppConfig extends Context.Service()("@opencode/stats/AppConfig") { static readonly config = config static readonly layer: Layer.Layer = Layer.effect( AppConfig, config.parse(ConfigProvider.fromEnv()).pipe(Effect.orDie), ) }