From b283fdb589f1a72874874737fd2b33784bd1e265 Mon Sep 17 00:00:00 2001 From: Ferenc Viasz-Kadi Date: Tue, 15 Oct 2024 21:10:18 +0200 Subject: [PATCH] updated transformer syntax --- Sources/ToucanSDK/Config/Config.swift | 49 ++++++++++++++----- .../ToucanSDK/ContextStore/ContextStore.swift | 16 +++--- .../Transformers/PipelineExecutor.swift | 4 +- Sources/toucan-cli/Commands/Generate.swift | 17 ++++--- Sources/toucan-cli/Commands/Watch.swift | 9 ++-- .../Extensions/Toucan+UserErrors.swift | 14 +++++- 6 files changed, 75 insertions(+), 34 deletions(-) diff --git a/Sources/ToucanSDK/Config/Config.swift b/Sources/ToucanSDK/Config/Config.swift index f379fddc..8e1219c1 100644 --- a/Sources/ToucanSDK/Config/Config.swift +++ b/Sources/ToucanSDK/Config/Config.swift @@ -175,23 +175,45 @@ struct Config { } struct Pipeline { - let types: [String] - let run: [String] + + enum Keys { + static let run = "run" + static let render = "render" + } + + struct Run { + + enum Keys { + static let name = "name" + } + + let name: String + + init?(_ dict: [String: Any]) { + guard let name = dict.string(Keys.name) else { + return nil + } + self.name = name + } + } + + let run: [Run] let render: Bool init(_ dict: [String: Any]) { - self.types = dict.array("types", as: String.self) - self.run = dict.array("run", as: String.self) - self.render = dict.bool("render") ?? false + self.run = dict + .array(Keys.run, as: [String: Any].self) + .map { Run($0)! } + self.render = dict.bool(Keys.render) ?? true } } let folder: String - let pipelines: [Pipeline] + let pipelines: [String: Pipeline] init( folder: String, - pipelines: [Pipeline] + pipelines: [String: Pipeline] ) { self.folder = folder self.pipelines = pipelines @@ -201,9 +223,14 @@ struct Config { self.folder = dict.string(Location.Keys.folder) ?? Config.defaults.transformers.folder - - self.pipelines = dict.array(Keys.pipelines, as: [String: Any].self) - .map { .init($0) } + self.pipelines = dict + .dict(Keys.pipelines) + .compactMapValues { (item: Any) -> Pipeline? in + guard let dict = item as? [String: Any] else { + return nil + } + return Pipeline(dict) + } } } @@ -263,7 +290,7 @@ extension Config { ), transformers: .init( folder: "transformers", - pipelines: [] + pipelines: [:] ) ) } diff --git a/Sources/ToucanSDK/ContextStore/ContextStore.swift b/Sources/ToucanSDK/ContextStore/ContextStore.swift index ddae4a2b..108331bc 100644 --- a/Sources/ToucanSDK/ContextStore/ContextStore.swift +++ b/Sources/ToucanSDK/ContextStore/ContextStore.swift @@ -156,11 +156,12 @@ struct ContextStore { pageBundle: pageBundle ) ) - let pipelines = sourceConfig.config.transformers.pipelines.filter { - $0.types.contains(pageBundle.contentType.id) && !$0.run.isEmpty - } - - for pipeline in pipelines { + + let pipelines = sourceConfig.config.transformers.pipelines + let pipeline = pipelines[pageBundle.contentType.id] + var didRenderHTML = false + + if let pipeline, !pipeline.run.isEmpty { let executor = PipelineExecutor( pipeline: pipeline, pageBundle: pageBundle, @@ -171,14 +172,13 @@ struct ContextStore { ) do { contents = try executor.execute() + didRenderHTML = true } catch { logger.error("\(String(describing: error))") } } - - let didRenderHTML = pipelines.map { $0.render }.contains(true) - + if didRenderHTML { let tocElements = htmlToCParser.parse(from: contents) ?? [] return [ diff --git a/Sources/ToucanSDK/Transformers/PipelineExecutor.swift b/Sources/ToucanSDK/Transformers/PipelineExecutor.swift index c4906e74..c9357f56 100644 --- a/Sources/ToucanSDK/Transformers/PipelineExecutor.swift +++ b/Sources/ToucanSDK/Transformers/PipelineExecutor.swift @@ -36,9 +36,7 @@ struct PipelineExecutor { for run in pipeline.run { let runUrl = sourceConfig.transformersUrl - .appendingPathComponent( - run - ) + .appendingPathComponent(run.name) guard fileManager.fileExists(at: runUrl) else { continue } diff --git a/Sources/toucan-cli/Commands/Generate.swift b/Sources/toucan-cli/Commands/Generate.swift index 1e74cdbe..b0e6a496 100644 --- a/Sources/toucan-cli/Commands/Generate.swift +++ b/Sources/toucan-cli/Commands/Generate.swift @@ -29,14 +29,15 @@ extension Entrypoint { baseUrl: baseUrl, logger: logger ) - generator.generateAndLogErrors(logger) - - let metadata: Logger.Metadata = [ - "input": "\(input)", - "output": "\(output)", - "baseUrl": "\(String(describing: baseUrl?.description))", - ] - logger.info("Site generated successfully.", metadata: metadata) + + if generator.generateAndLogErrors(logger) { + let metadata: Logger.Metadata = [ + "input": "\(input)", + "output": "\(output)", + "baseUrl": "\(String(describing: baseUrl?.description))", + ] + logger.info("Site generated successfully.", metadata: metadata) + } } } } diff --git a/Sources/toucan-cli/Commands/Watch.swift b/Sources/toucan-cli/Commands/Watch.swift index aa2a3123..91be6f32 100644 --- a/Sources/toucan-cli/Commands/Watch.swift +++ b/Sources/toucan-cli/Commands/Watch.swift @@ -46,7 +46,7 @@ extension Entrypoint { logger: logger ) generator.generateAndLogErrors(logger) - + #if os(macOS) let eventStream = try EonilFSEventStream( pathsToWatch: [input], @@ -66,8 +66,11 @@ extension Entrypoint { } logger.info("Generating site...") - generator.generateAndLogErrors(logger) - logger.info("Site re-generated.") + if generator.generateAndLogErrors(logger) { + logger.info("Site re-generated.") + } else { + logger.info("Site generation failed.") + } } ) diff --git a/Sources/toucan-cli/Extensions/Toucan+UserErrors.swift b/Sources/toucan-cli/Extensions/Toucan+UserErrors.swift index b749fe62..79d381e6 100644 --- a/Sources/toucan-cli/Extensions/Toucan+UserErrors.swift +++ b/Sources/toucan-cli/Extensions/Toucan+UserErrors.swift @@ -10,9 +10,11 @@ import Logging extension Toucan { - func generateAndLogErrors(_ logger: Logger) { + @discardableResult + func generateAndLogErrors(_ logger: Logger) -> Bool { do { try generate() + return true } catch let error as FileLoader.Error { switch error { @@ -69,8 +71,18 @@ extension Toucan { ) } } + catch let error as SiteLoader.Error { + switch error { + case .missing(let url): + logger.error( + "Missing site file at: `\(url.absoluteString)`." + ) + } + } catch { logger.error("\(String(describing: error))") } + + return false } }