execute method
Execute the tool with the given input.
Implementation
@override
Future<ToolResult> execute(Map<String, dynamic> input) async {
final parsed = ConfigToolInput.fromJson(input);
final setting = parsed.setting;
// 1. Check if setting is supported.
if (!_registry.isSupported(setting)) {
return _errorResult('Unknown setting: "$setting"');
}
final config = _registry.getConfig(setting)!;
final path = _registry.getPath(setting);
// 2. GET operation.
if (parsed.isGet) {
final currentValue = _getValue(config.source, path);
final displayValue = config.formatOnRead != null
? config.formatOnRead!(currentValue)
: currentValue;
return _successResult(
ConfigToolOutput(
success: true,
operation: 'get',
setting: setting,
value: displayValue,
),
);
}
// 3. SET operation.
var finalValue = parsed.value;
// Coerce and validate boolean values.
if (config.type == SettingType.boolean) {
if (finalValue is String) {
final lower = finalValue.toLowerCase().trim();
if (lower == 'true') {
finalValue = true;
} else if (lower == 'false') {
finalValue = false;
}
}
if (finalValue is! bool) {
return _errorResult(
'$setting requires true or false.',
operation: 'set',
setting: setting,
);
}
}
// Check options.
final options = _registry.getOptionsForSetting(setting);
if (options != null && !options.contains(finalValue.toString())) {
return _errorResult(
'Invalid value "$finalValue". Options: ${options.join(", ")}',
operation: 'set',
setting: setting,
);
}
// Async validation.
if (config.validateOnWrite != null) {
final validation = await config.validateOnWrite!(finalValue);
if (!validation.isValid) {
return _errorResult(
validation.error ?? 'Validation failed',
operation: 'set',
setting: setting,
);
}
}
final previousValue = _getValue(config.source, path);
// 4. Write to storage.
try {
if (config.source == SettingSource.global) {
final key = path.first;
_globalConfig.setValue(key, finalValue);
} else {
final result = _settings.setValueAtPath(path, finalValue);
if (!result.isValid) {
return _errorResult(
result.error ?? 'Failed to update setting',
operation: 'set',
setting: setting,
);
}
}
// 5. Sync to AppState if needed.
if (config.appStateKey != null && onAppStateSync != null) {
onAppStateSync!(config.appStateKey!, finalValue);
}
return _successResult(
ConfigToolOutput(
success: true,
operation: 'set',
setting: setting,
previousValue: previousValue,
newValue: finalValue,
),
);
} catch (e) {
return _errorResult('$e', operation: 'set', setting: setting);
}
}