| // 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 '../convert.dart'; |
| import 'file_system.dart'; |
| import 'logger.dart'; |
| import 'platform.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] ?? '.'; |
| } |
| } |