execute method

  1. @override
Future<ToolResult> execute(
  1. Map<String, dynamic> input
)
override

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);
  }
}