diff --git a/.github/workflows/actions/setup/action.yml b/.github/workflows/actions/setup/action.yml index 284e9c0df27..2d93d053c57 100644 --- a/.github/workflows/actions/setup/action.yml +++ b/.github/workflows/actions/setup/action.yml @@ -17,7 +17,6 @@ runs: - uses: irgaly/setup-mint@v1 with: mint-executable-directory: $HOME/.mint/bin - - uses: dcarbone/install-yq-action@v1.1.1 - name: "Xcode Cache" if: contains(inputs.os, 'macos') diff --git a/Makefile b/Makefile index 3f86781f42e..a09373fdf8b 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ # Variables .DEFAULT_GOAL := install -OPENAPI_PATH := Submodule/github/rest-api-description/descriptions/api.github.com/api.github.com.yaml -FILTERED_NAMES := $(shell yq -r '.tags[].name' $(OPENAPI_PATH)) +OPENAPI_PATH := Submodule/github/rest-api-description/descriptions/api.github.com/api.github.com.json +FILTERED_NAMES := $(shell swift Scripts/PackageTargetsParser.swift $(OPENAPI_PATH)) SOURCE_DIRS := $(addprefix Sources/, $(FILTERED_NAMES)) PACKAGE_PATHS := Package.swift # Fix: https://github.com/irgaly/setup-mint/pull/25 diff --git a/Scripts/PackageTargetsParser.swift b/Scripts/PackageTargetsParser.swift new file mode 100644 index 00000000000..8ac6c497f2c --- /dev/null +++ b/Scripts/PackageTargetsParser.swift @@ -0,0 +1,64 @@ +// +// PackageTargetsParser.swift +// GitHubRestAPISwiftOpenAPI +// +// Created by zwc on 2025/5/11. +// + +import Foundation + +struct ErrorMessage: LocalizedError { + var message: String + var errorDescription: String? { message } + init(message: String, line: Int = #line) { + self.message = "\(line): \(message)" + } +} + +/// A struct that parses a JSON file containing a "tags" array, extracting the "name" field from each element. +struct PackageTargetsParser { + + /// Parses the provided JSON file and extracts the "name" values from the "tags" array. + /// + /// - Parameter path: The path to the JSON file to be parsed. + /// - Returns: An array of strings representing the "name" values found in the "tags" array. + /// - Throws: An error if the file cannot be read or the JSON structure is invalid. + /// + /// Example: + /// + /// Given a JSON file: + /// ```json + /// { + /// "tags": [ + /// { "name": "user" }, + /// { "name": "admin" }, + /// { "name": "billing" } + /// ] + /// } + /// ``` + /// The function will return: + /// ```swift + /// ["user", "admin", "billing"] + /// ``` + func parse(from path: String) throws -> [String] { + let data = try Data(contentsOf: URL(fileURLWithPath: path)) + let json = try JSONSerialization.jsonObject(with: data, options: []) + if let dict = json as? [String: Any], let tags = dict["tags"] as? [[String: Any]] { + return tags.compactMap { $0["name"] as? String } + } else { + throw ErrorMessage(message: "Properties not found.") + } + } +} + +if let argPath = CommandLine.arguments[1] + .split(whereSeparator: \.isNewline) + .first { + let path = String(argPath) + let names = try PackageTargetsParser().parse(from: path) + print(names.joined(separator: "\n")) +} else { + throw ErrorMessage(message: "PackageTargetsParser.parse(from:) failure") +} + +