Files
wehub-resource-sync 8cb1f9f479
Publish SDK (PyPI) / publish (push) Waiting to run
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/sdk) (push) Waiting to run
Publish SDK (npm) / publish (officecli-sdk) (push) Waiting to run
SDK smoke / smoke (windows-latest) (push) Waiting to run
SDK smoke / smoke (macos-latest) (push) Waiting to run
SDK smoke / smoke (ubuntu-latest) (push) Waiting to run
Skill parity / diff (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:09:29 +08:00

66 lines
2.7 KiB
C#

// Copyright 2026 OfficeCLI (https://OfficeCLI.AI)
// SPDX-License-Identifier: Apache-2.0
using System.CommandLine;
using OfficeCli.Core;
using OfficeCli.Handlers;
namespace OfficeCli;
static partial class CommandBuilder
{
private static Command BuildValidateCommand(Option<bool> jsonOption)
{
var validateFileArg = new Argument<FileInfo>("file") { Description = "Office document path (required even with open/close mode)" };
var validateCommand = new Command("validate", "Validate document against OpenXML schema");
validateCommand.Add(validateFileArg);
validateCommand.Add(jsonOption);
validateCommand.SetAction(result => { var json = result.GetValue(jsonOption); return SafeRun(() =>
{
var file = result.GetValue(validateFileArg)!;
if (TryResident(file.FullName, req =>
{
req.Command = "validate";
req.Json = json;
}, json) is {} rc) return rc;
using var handler = DocumentHandlerFactory.Open(file.FullName);
var errors = handler.Validate();
if (json)
{
var validationJson = FormatValidationErrors(errors);
// JSON Envelope contract: validate is a *judgment* command —
// schema errors mean the document failed validation, so the
// envelope must reflect that on success. exit code already
// mirrors this at line below.
Console.WriteLine(OutputFormatter.WrapEnvelope(validationJson, success: errors.Count == 0));
}
else
{
if (errors.Count == 0)
{
Console.WriteLine("Validation passed: no errors found.");
}
else
{
// R7-bt-4: schema validation reports go to stderr —
// callers piping `validate` for CI gates need to see
// the failure summary on the diagnostic stream rather
// than mixed into stdout. Mirrors the resident path.
Console.Error.WriteLine($"Found {errors.Count} validation error(s):");
foreach (var err in errors)
{
Console.Error.WriteLine($" [{err.ErrorType}] {err.Description}");
if (err.Path != null) Console.Error.WriteLine($" Path: {err.Path}");
if (err.Part != null) Console.Error.WriteLine($" Part: {err.Part}");
}
}
}
return errors.Count > 0 ? 1 : 0;
}, json); });
return validateCommand;
}
}