From d7c3f4a5992bfaa0a909fb5163eda974e29e7c26 Mon Sep 17 00:00:00 2001
From: darthsharp <48331467+darthsharp@users.noreply.github.com>
Date: Sat, 25 Apr 2026 17:10:06 +0200
Subject: [PATCH] Add support for compile-time options in Homebrew formulas
- Introduced `BrewFormulaOptionModel` to represent individual formula options.
- Updated `BrewFormulaModel` to use `BrewFormulaOptionModel[]` for options.
- Added unit tests for deserialization of `BrewFormulaOptionModel`.
---
.../Models/Formulae/BrewFormulaModel.cs | 2 +-
.../Models/Formulae/BrewFormulaOptionModel.cs | 19 +++++++
.../Formulae/BrewFormulaOptionModelTests.cs | 56 +++++++++++++++++++
3 files changed, 76 insertions(+), 1 deletion(-)
create mode 100644 source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs
create mode 100644 tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs
diff --git a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs
index bb3eea6..1119e5c 100644
--- a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs
+++ b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs
@@ -97,7 +97,7 @@ public class BrewFormulaModel
/// Gets or sets compile-time options (rarely used).
[JsonPropertyName("options")]
- public string[]? Options { get; set; }
+ public BrewFormulaOptionModel[]? Options { get; set; }
/// Gets or sets build-time dependencies.
[JsonPropertyName("build_dependencies")]
diff --git a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs
new file mode 100644
index 0000000..f14f014
--- /dev/null
+++ b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs
@@ -0,0 +1,19 @@
+using System.Text.Json.Serialization;
+using JetBrains.Annotations;
+
+namespace CreativeCoders.MacOS.HomeBrew.Models.Formulae;
+
+///
+/// Represents a compile-time option for a Homebrew formula.
+///
+[UsedImplicitly]
+public class BrewFormulaOptionModel
+{
+ /// Gets or sets the option flag (e.g. --without-mono).
+ [JsonPropertyName("option")]
+ public string? Option { get; set; }
+
+ /// Gets or sets the human-readable description of the option.
+ [JsonPropertyName("description")]
+ public string? Description { get; set; }
+}
diff --git a/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs b/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs
new file mode 100644
index 0000000..fcc19aa
--- /dev/null
+++ b/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs
@@ -0,0 +1,56 @@
+using System.Text.Json;
+using AwesomeAssertions;
+using CreativeCoders.MacOS.HomeBrew.Models.Formulae;
+
+namespace CreativeCoders.MacOS.HomeBrew.Tests.Models.Formulae;
+
+public class BrewFormulaOptionModelTests
+{
+ [Fact]
+ public void Deserialize_WhenOptionsContainObjects_ReturnsModelsWithProperties()
+ {
+ const string json = """
+ {
+ "options": [
+ {"option": "--without-mono", "description": "Build without mono support"}
+ ]
+ }
+ """;
+
+ var result = JsonSerializer.Deserialize(json);
+
+ result!.Options.Should().HaveCount(1);
+ result.Options![0].Option.Should().Be("--without-mono");
+ result.Options[0].Description.Should().Be("Build without mono support");
+ }
+
+ [Fact]
+ public void Deserialize_WhenOptionsIsEmptyArray_ReturnsEmptyArray()
+ {
+ const string json = """{"options": []}""";
+
+ var result = JsonSerializer.Deserialize(json);
+
+ result!.Options.Should().BeEmpty();
+ }
+
+ [Fact]
+ public void Deserialize_WhenOptionsIsNull_ReturnsNull()
+ {
+ const string json = """{"options": null}""";
+
+ var result = JsonSerializer.Deserialize(json);
+
+ result!.Options.Should().BeNull();
+ }
+
+ [Fact]
+ public void Deserialize_WhenOptionsIsMissing_ReturnsNull()
+ {
+ const string json = """{}""";
+
+ var result = JsonSerializer.Deserialize(json);
+
+ result!.Options.Should().BeNull();
+ }
+}