generateConfigurableHomebrewFormula function

String generateConfigurableHomebrewFormula({
  1. required HomebrewFormulaConfig config,
  2. required List<HomebrewArtifact> artifacts,
})

Renders a product-neutral Formula for macOS and Linux artifacts.

Implementation

String generateConfigurableHomebrewFormula({
  required HomebrewFormulaConfig config,
  required List<HomebrewArtifact> artifacts,
}) {
  String artifact(String platform, String architecture) {
    return artifacts
        .singleWhere(
          (item) =>
              item.platform == platform && item.architecture == architecture,
        )
        .fileName;
  }

  HomebrewArtifact details(String platform, String architecture) {
    return artifacts.singleWhere(
      (item) => item.platform == platform && item.architecture == architecture,
    );
  }

  final macArm = details('macos', 'arm64');
  final macX64 = details('macos', 'x64');
  final linuxArm = details('linux', 'arm64');
  final linuxX64 = details('linux', 'x64');
  final kegOnly = config.versioned ? '\n  keg_only :versioned_formula\n' : '';

  return '''
class ${config.className} < Formula
  desc "${config.description}"
  homepage "${config.homepage}"
  version "${config.version}"$kegOnly

  on_macos do
    on_arm do
      url "${macArm.url}"
      sha256 "${macArm.sha256}"
    end
    on_intel do
      url "${macX64.url}"
      sha256 "${macX64.sha256}"
    end
  end

  on_linux do
    on_intel do
      url "${linuxX64.url}"
      sha256 "${linuxX64.sha256}"
    end
    on_arm do
      url "${linuxArm.url}"
      sha256 "${linuxArm.sha256}"
    end
  end

  def install
    if OS.mac? && Hardware::CPU.arm?
      bin.install "${artifact('macos', 'arm64')}" => "${config.executableName}"
    elsif OS.mac? && Hardware::CPU.intel?
      bin.install "${artifact('macos', 'x64')}" => "${config.executableName}"
    elsif OS.linux? && Hardware::CPU.intel?
      bin.install "${artifact('linux', 'x64')}" => "${config.executableName}"
    elsif OS.linux? && Hardware::CPU.arm?
      bin.install "${artifact('linux', 'arm64')}" => "${config.executableName}"
    end
  end

  test do
    system "#{bin}/${config.executableName}", "--version"
  end
end
''';
}