Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ModularPipelines/Context/LinuxInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public virtual async Task<CommandResult> InstallFromDpkg(DpkgInstallOptions opti
{
var linuxInstallationResult = await _command.ExecuteCommandLineTool(options).ConfigureAwait(false);

await _aptGet.Install(new AptGetInstallOptions(null!)
await _aptGet.Install(new AptGetInstallOptions
{
FixBroken = true,
}).ConfigureAwait(false);
Expand Down
59 changes: 35 additions & 24 deletions src/ModularPipelines/Models/ModuleResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -447,32 +447,43 @@ internal sealed class ModuleResultJsonConverter<T> : JsonConverter<ModuleResult<
}
}

if (moduleName is null)
{
throw new JsonException("ModuleName is required but was not found in the JSON.");
}

return discriminator switch
{
"Success" => new ModuleResult<T>.Success(value!)
{
ModuleName = moduleName!,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
},
"Failure" => new ModuleResult<T>.Failure(exception!)
{
ModuleName = moduleName!,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
},
"Skipped" => new ModuleResult<T>.Skipped(skipDecision!)
{
ModuleName = moduleName!,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
},
"Success" => value is not null
? new ModuleResult<T>.Success(value)
{
ModuleName = moduleName,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
}
: throw new JsonException("Success result requires a Value property in the JSON."),
"Failure" => exception is not null
? new ModuleResult<T>.Failure(exception)
{
ModuleName = moduleName,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
}
: throw new JsonException("Failure result requires an Exception property in the JSON."),
"Skipped" => skipDecision is not null
? new ModuleResult<T>.Skipped(skipDecision)
{
ModuleName = moduleName,
ModuleDuration = moduleDuration,
ModuleStart = moduleStart,
ModuleEnd = moduleEnd,
ModuleStatus = moduleStatus
}
: throw new JsonException("Skipped result requires a Decision property in the JSON."),
_ => throw new JsonException($"Unknown discriminator: {discriminator}")
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@ namespace ModularPipelines.Options.Linux.AptGet;
[ExcludeFromCodeCoverage]
public record AptGetInstallOptions : AptGetOptions
{
/// <summary>
/// Initializes a new instance of the <see cref="AptGetInstallOptions"/> class
/// without specifying a package. Use this when running commands like
/// <c>apt-get install --fix-broken</c> that don't require a package name.
/// </summary>
public AptGetInstallOptions()
{
}

/// <summary>
/// Initializes a new instance of the <see cref="AptGetInstallOptions"/> class
/// with the specified package to install.
/// </summary>
/// <param name="package">The name of the package to install.</param>
public AptGetInstallOptions(string package)
{
Package = package;
Expand All @@ -15,5 +29,5 @@ public AptGetInstallOptions(string package)
public virtual string CommandName { get; } = "install";

[CliArgument(Placement = ArgumentPlacement.AfterOptions)]
public virtual string Package { get; }
public virtual string? Package { get; }
}
Loading