blob: 77cc2b91d5f920433d9b003f3e89bb146948dd5c [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:platform/platform.dart';
import '../convert.dart';
import 'file_system.dart';
import 'logger.dart';
import 'utils.dart';
/// A class to abstract configuration files.
class Config {
/// Constructs a new [Config] object from a file called [name] in the
/// current user's home directory as determined by the [Platform] and
/// [FileSystem].
factory Config(
String name, {
@required FileSystem fileSystem,
@required Logger logger,
@required Platform platform,
}) {
final File file = fileSystem.file(fileSystem.path.join(
_userHomePath(platform),
name,
));
return Config._(file, logger);
}
/// Constructs a new [Config] object from a file called [name] in
/// the given [Directory].
factory Config.test(
String name, {
@required Directory directory,
@required Logger logger,
}) => Config._(directory.childFile(name), logger);
Config._(File file, Logger logger) : _file = file, _logger = logger {
if (!_file.existsSync()) {
return;
}
try {
_values = castStringKeyedMap(json.decode(_file.readAsStringSync()));
} on FormatException {
_logger
..printError('Failed to decode preferences in ${_file.path}.')
..printError(
'You may need to reapply any previously saved configuration '
'with the "flutter config" command.',
);
_file.deleteSync();
}
}
/// The default name for the Flutter config file.
static const String kFlutterSettings = '.flutter_settings';
final Logger _logger;
File _file;
String get configPath => _file.path;
Map<String, dynamic> _values = <String, dynamic>{};
Iterable<String> get keys => _values.keys;
bool containsKey(String key) => _values.containsKey(key);
dynamic getValue(String key) => _values[key];
void setValue(String key, Object value) {
_values[key] = value;
_flushValues();
}
void removeValue(String key) {
_values.remove(key);
_flushValues();
}
void _flushValues() {
String json = const JsonEncoder.withIndent(' ').convert(_values);
json = '$json\n';
_file.writeAsStringSync(json);
}
// Reads the process environment to find the current user's home directory.
//
// If the searched environment variables are not set, '.' is returned instead.
//
// Note that this is different from FileSystemUtils.homeDirPath.
static String _userHomePath(Platform platform) {
final String envKey = platform.operatingSystem == 'windows'
? 'APPDATA'
: 'HOME';
return platform.environment[envKey] ?? '.';
}
}