when (NimMajor, NimMinor) < (1, 4):
  {.push raises: [Defect].}
else:
  {.push raises: [].}


import
  stew/shims/macros,
  serialization
import
   ./envvar_serialization/reader, 
   ./envvar_serialization/writer

export
  serialization, 
  reader, 
  writer


serializationFormat Envvar

Envvar.setReader EnvvarReader
Envvar.setWriter EnvvarWriter, PreferredOutput = void


template supports*(_: type Envvar, T: type): bool =
  # The Envvar format should support every type
  true

template decode*(_: type Envvar,
                 prefix: string,
                 RecordType: distinct type,
                 params: varargs[untyped]): auto =
  mixin init, ReaderType

  {.noSideEffect.}:
    var reader = unpackArgs(init, [EnvvarReader, prefix, params])
    reader.readValue(RecordType)

template encode*(_: type Envvar,
                 prefix: string,
                 value: auto,
                 params: varargs[untyped]) =
  mixin init, WriterType, writeValue

  {.noSideEffect.}:
    var writer = unpackArgs(init, [EnvvarWriter, prefix, params])
    writeValue writer, value

template loadFile*(_: type Envvar,
                   prefix: string,
                   RecordType: distinct type,
                   params: varargs[untyped]): auto =
  mixin init, ReaderType, readValue

  var reader = unpackArgs(init, [EnvvarReader, prefix, params])
  reader.readValue(RecordType)

template saveFile*(_: type Envvar, prefix: string, value: auto, params: varargs[untyped]) =
  mixin init, WriterType, writeValue

  var writer = unpackArgs(init, [EnvvarWriter, prefix, params])
  writer.writeValue(value)