/// 약속 (설정 A): 설정 분야 하나 - 자기 키 (이름 · 처음 값 · 읽기 · 쓰기) 를 스스로 갖는다. /// 설정 하나를 더할 때는 그 분야 파일만 고친다 (settings.dart 의 toJson · fromJson 은 고치지 않음 - 분야 목록을 돌며 합치기만). /// 저장 파일 모양 (평평한 키) 은 그대로 - 키 이름을 바꾸지 않는다 abstract class SettingsGroup { /// 저장할 키와 값을 [j] 에 넣는다. [plainSecrets]: 안전 저장소를 쓸 수 없을 때만 비밀 값도 파일에 void write(Map j, {required bool plainSecrets}); /// 설정 파일 [j] 에서 읽는다 - 없거나 틀린 값은 처음 값 (또는 고친 값) void read(Map j); } /// 저장된 이름으로 열거형 값 고르기 (모르는 이름 · 없으면 [fallback]) - 분야들의 읽기가 같이 쓴다 T pickEnum(List values, Object? name, T fallback) => values.firstWhere((v) => v.name == name, orElse: () => fallback);