From 7a212c41bf0fa42cc58560d0fefef331e74f5402 Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 13:57:16 +0200 Subject: [PATCH 1/7] Fix link in readme.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d7cef92..0d3648c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It provides a user-friendly editor for creating complex email filtering rules wi - 📚 Palette of commands, including core Sieve and provider-specific extensions - 🖱️ Drag & drop support for reordering and nesting commands - 🔄 Rendering of the visual script into valid Sieve source code -- 🛠️ Extensible architecture – easily add new commands (see [How To Add New Command](Source/Sieve%20Commands/HowToAddNewCommand.md)) +- 🛠️ Extensible architecture – easily add new commands (see [How To Add New Command](Source/Yasba/Sieve%20Commands/HowToAddNewCommand.md)) ## Architecture Overview @@ -40,7 +40,7 @@ Yasba is designed with extensibility in mind. The main architectural components Contributions are welcome! -Check out [How To Add New Command](HowToAddNewCommand.md) to learn how to extend Yasba with new Sieve commands. +Check out [How To Add New Command](Source/Yasba/Sieve%20Commands/HowToAddNewCommand.md) to learn how to extend Yasba with new Sieve commands. ## License From bbe0d07b29d5e3f949c008650c559e207dc2f172 Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:00:24 +0200 Subject: [PATCH 2/7] Conditional remove row --- .../Yasba/Views/Sieve Script/Row Token/RowToken.swift | 7 +++++++ Source/Yasba/Views/Sieve Script/SieveScriptView.swift | 10 +++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/Yasba/Views/Sieve Script/Row Token/RowToken.swift b/Source/Yasba/Views/Sieve Script/Row Token/RowToken.swift index c7a378f..d96bba4 100644 --- a/Source/Yasba/Views/Sieve Script/Row Token/RowToken.swift +++ b/Source/Yasba/Views/Sieve Script/Row Token/RowToken.swift @@ -18,4 +18,11 @@ enum RowToken: Identifiable, Equatable { static func == (lhs: RowToken, rhs: RowToken) -> Bool { lhs.id == rhs.id } + + var canRemove: Bool { + switch self { + case .elseMarker, .endIf: return false + default: return true + } + } } diff --git a/Source/Yasba/Views/Sieve Script/SieveScriptView.swift b/Source/Yasba/Views/Sieve Script/SieveScriptView.swift index b33246b..e33e60b 100644 --- a/Source/Yasba/Views/Sieve Script/SieveScriptView.swift +++ b/Source/Yasba/Views/Sieve Script/SieveScriptView.swift @@ -22,14 +22,14 @@ struct SieveScriptView: View { } var placeholderInsertPosition: Int? { - guard let g = dropGapIndex else { return nil } - if let pos = filteredIndices.firstIndex(where: { $0 >= g }) { return pos } + guard let gap = dropGapIndex else { return nil } + if let pos = filteredIndices.firstIndex(where: { $0 >= gap }) { return pos } return filteredIndices.count } var placeholderLeading: CGFloat { - guard let g = dropGapIndex else { return 0 } - if let index = tokens.indices.first(where: { $0 >= g }) { return CGFloat(indents[index]) * 24 } + guard let gap = dropGapIndex else { return 0 } + if let index = tokens.indices.first(where: { $0 >= gap }) { return CGFloat(indents[index]) * 24 } return CGFloat(indents.last ?? 0) * 24 } @@ -139,7 +139,7 @@ struct SieveScriptView: View { RowTokenToViewMapper.row(for: token) Spacer(minLength: 0) } - if hoveredRow == index { + if hoveredRow == index && token.canRemove { Button { viewModel.remove(at: index) hoveredRow = nil From 7ad46c3e7949f7b15de705e4a46c643701aaa51b Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:20:48 +0200 Subject: [PATCH 3/7] Fix requirement --- .../Extension/Proton/Expire/ProtonExpireCommand.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift b/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift index 8f3969f..47560c4 100644 --- a/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift +++ b/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift @@ -6,7 +6,7 @@ final class ProtonExpireCommand: SieveCommand, SieveCommandValueEquatable { var days: Int var isContainer: Bool { false } - let requirements = ["imap4flags"] + let requirements = ["vnd.proton.expire"] init(days: Int) { self.days = days From f6828e3501dbaca3b41b5ae1fd650539b7cd8a34 Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:21:10 +0200 Subject: [PATCH 4/7] IfCommand requirements --- Source/Tests/Sieve Command/IfCommandTests.swift | 16 ++++++++++++++++ Source/Tests/TestSupport.swift | 4 +++- .../Yasba/Sieve Commands/Core/If/IfCommand.swift | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Source/Tests/Sieve Command/IfCommandTests.swift diff --git a/Source/Tests/Sieve Command/IfCommandTests.swift b/Source/Tests/Sieve Command/IfCommandTests.swift new file mode 100644 index 0000000..243f9ac --- /dev/null +++ b/Source/Tests/Sieve Command/IfCommandTests.swift @@ -0,0 +1,16 @@ +import Testing +@testable import Yasba + +struct IfCommandTests { + @Test func example() throws { + let command = IfCommand( + quantifier: .any, + tests: [ ], + thenChildren: [ DummyLeaf("do1") ], + elseChildren: [ DummyLeaf("do2") ] + ) + + #expect(command.requirements == [DummyLeaf.requirement, DummyLeaf.requirement]) + } +} + diff --git a/Source/Tests/TestSupport.swift b/Source/Tests/TestSupport.swift index fcf45fa..6e5caec 100644 --- a/Source/Tests/TestSupport.swift +++ b/Source/Tests/TestSupport.swift @@ -4,6 +4,8 @@ import Testing /// Minimal non-container command used across tests. Identity is stable via `id`. final class DummyLeaf: SieveCommand, SieveCommandValueEquatable { + static let requirement: String = "requirement" + let id: UUID var isContainer: Bool { false } let text: String @@ -13,7 +15,7 @@ final class DummyLeaf: SieveCommand, SieveCommandValueEquatable { self.id = id } - var requirements: [String] { [] } + var requirements: [String] { [DummyLeaf.requirement] } func isSemanticallyEqual(to other: any SieveCommand) -> Bool { guard let other = other as? DummyLeaf else { return false } diff --git a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift index 6f55c90..b7e2145 100644 --- a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift @@ -24,6 +24,10 @@ final class IfCommand: SieveContainerCommand, SieveCommandValueEquatable { var tests: [SieveTest] var thenChildren: [AnySieveCommand] var elseChildren: [AnySieveCommand] + + var requirements: [String] { + return (thenChildren + elseChildren).flatMap { $0.requirements } + } init( quantifier: IfQuantifier = .any, From eac243e2ad9c588c46bf148a68b4d92768dc5b7e Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:31:53 +0200 Subject: [PATCH 5/7] Adding test for requirement definitions --- .../AddFlag}/AddFlagCommandRendererTests.swift | 0 .../Sieve Commands/AddFlag/AddFlagCommandTests.swift | 10 ++++++++++ .../FileInto}/FileIntoCommandRendererTests.swift | 0 .../Sieve Commands/FileInto/FileIntoCommandTests.swift | 10 ++++++++++ .../IfCommand}/IfCommandRendererTests.swift | 0 .../IfCommand}/IfCommandTests.swift | 2 +- .../Expire}/ProtonExpireCommandRendererTests.swift | 0 .../Proton/Expire/ProtonExpireCommandTests.swift | 10 ++++++++++ .../MarkAsRead/ProtonMarkAsReadCommandTests.swift | 10 ++++++++++ .../MarkAsRead}/ProtonMarkAsReadRendererTests.swift | 0 .../Proton/Spam}/ProtonSpamCommandRendererTests.swift | 0 .../Proton/Spam/ProtonSpamCommandTests.swift | 10 ++++++++++ .../StopCommandRendererTests.swift | 0 Source/Tests/TestSupport.swift | 1 - .../Sieve Commands/Core/Add Flag/AddFlagCommand.swift | 2 -- ...leIntoFolderCommand.swift => FileIntoCommand.swift} | 4 +--- Source/Yasba/Sieve Commands/Core/If/IfCommand.swift | 1 - .../Yasba/Sieve Commands/Core/Stop/StopCommand.swift | 1 - .../Extension/Proton/Expire/ProtonExpireCommand.swift | 2 -- .../Proton/MarkAsRead/ProtonMarkAsReadCommand.swift | 2 -- .../Extension/Proton/Spam/ProtonSpamCommand.swift | 2 -- Source/Yasba/Sieve Commands/SieveCommand.swift | 1 - 22 files changed, 52 insertions(+), 16 deletions(-) rename Source/Tests/{Sieve Command => Sieve Commands/AddFlag}/AddFlagCommandRendererTests.swift (100%) create mode 100644 Source/Tests/Sieve Commands/AddFlag/AddFlagCommandTests.swift rename Source/Tests/{Sieve Command => Sieve Commands/FileInto}/FileIntoCommandRendererTests.swift (100%) create mode 100644 Source/Tests/Sieve Commands/FileInto/FileIntoCommandTests.swift rename Source/Tests/{Sieve Command => Sieve Commands/IfCommand}/IfCommandRendererTests.swift (100%) rename Source/Tests/{Sieve Command => Sieve Commands/IfCommand}/IfCommandTests.swift (86%) rename Source/Tests/{Sieve Command/Proton => Sieve Commands/Proton/Expire}/ProtonExpireCommandRendererTests.swift (100%) create mode 100644 Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandTests.swift create mode 100644 Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadCommandTests.swift rename Source/Tests/{Sieve Command/Proton => Sieve Commands/Proton/MarkAsRead}/ProtonMarkAsReadRendererTests.swift (100%) rename Source/Tests/{Sieve Command/Proton => Sieve Commands/Proton/Spam}/ProtonSpamCommandRendererTests.swift (100%) create mode 100644 Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandTests.swift rename Source/Tests/{Sieve Command => Sieve Commands}/StopCommandRendererTests.swift (100%) rename Source/Yasba/Sieve Commands/Core/File Into/{FileIntoFolderCommand.swift => FileIntoCommand.swift} (86%) diff --git a/Source/Tests/Sieve Command/AddFlagCommandRendererTests.swift b/Source/Tests/Sieve Commands/AddFlag/AddFlagCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/AddFlagCommandRendererTests.swift rename to Source/Tests/Sieve Commands/AddFlag/AddFlagCommandRendererTests.swift diff --git a/Source/Tests/Sieve Commands/AddFlag/AddFlagCommandTests.swift b/Source/Tests/Sieve Commands/AddFlag/AddFlagCommandTests.swift new file mode 100644 index 0000000..a79799a --- /dev/null +++ b/Source/Tests/Sieve Commands/AddFlag/AddFlagCommandTests.swift @@ -0,0 +1,10 @@ +import Testing +@testable import Yasba + +struct AddFlagCommandTests { + @Test func requirements() throws { + let command = AddFlagCommand(tag: "tag") + + #expect(command.requirements == ["imap4flags"]) + } +} diff --git a/Source/Tests/Sieve Command/FileIntoCommandRendererTests.swift b/Source/Tests/Sieve Commands/FileInto/FileIntoCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/FileIntoCommandRendererTests.swift rename to Source/Tests/Sieve Commands/FileInto/FileIntoCommandRendererTests.swift diff --git a/Source/Tests/Sieve Commands/FileInto/FileIntoCommandTests.swift b/Source/Tests/Sieve Commands/FileInto/FileIntoCommandTests.swift new file mode 100644 index 0000000..d2fea3f --- /dev/null +++ b/Source/Tests/Sieve Commands/FileInto/FileIntoCommandTests.swift @@ -0,0 +1,10 @@ +import Testing +@testable import Yasba + +struct FileIntoCommandTests { + @Test func requirements() throws { + let command = FileIntoCommand(mailbox: "inbox") + + #expect(command.requirements == ["fileinto"]) + } +} diff --git a/Source/Tests/Sieve Command/IfCommandRendererTests.swift b/Source/Tests/Sieve Commands/IfCommand/IfCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/IfCommandRendererTests.swift rename to Source/Tests/Sieve Commands/IfCommand/IfCommandRendererTests.swift diff --git a/Source/Tests/Sieve Command/IfCommandTests.swift b/Source/Tests/Sieve Commands/IfCommand/IfCommandTests.swift similarity index 86% rename from Source/Tests/Sieve Command/IfCommandTests.swift rename to Source/Tests/Sieve Commands/IfCommand/IfCommandTests.swift index 243f9ac..66bd778 100644 --- a/Source/Tests/Sieve Command/IfCommandTests.swift +++ b/Source/Tests/Sieve Commands/IfCommand/IfCommandTests.swift @@ -2,7 +2,7 @@ import Testing @testable import Yasba struct IfCommandTests { - @Test func example() throws { + @Test func childernRequirementsArePassed() throws { let command = IfCommand( quantifier: .any, tests: [ ], diff --git a/Source/Tests/Sieve Command/Proton/ProtonExpireCommandRendererTests.swift b/Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/Proton/ProtonExpireCommandRendererTests.swift rename to Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandRendererTests.swift diff --git a/Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandTests.swift b/Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandTests.swift new file mode 100644 index 0000000..a71459a --- /dev/null +++ b/Source/Tests/Sieve Commands/Proton/Expire/ProtonExpireCommandTests.swift @@ -0,0 +1,10 @@ +import Testing +@testable import Yasba + +struct ProtonExpireCommandTests { + @Test func requirements() throws { + let command = ProtonExpireCommand(days: 1) + + #expect(command.requirements == ["vnd.proton.expire"]) + } +} diff --git a/Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadCommandTests.swift b/Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadCommandTests.swift new file mode 100644 index 0000000..6462e12 --- /dev/null +++ b/Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadCommandTests.swift @@ -0,0 +1,10 @@ +import Testing +@testable import Yasba + +struct ProtonMarkAsReadCommandTests { + @Test func requirements() throws { + let command = ProtonMarkAsReadCommand() + + #expect(command.requirements == ["imap4flags"]) + } +} diff --git a/Source/Tests/Sieve Command/Proton/ProtonMarkAsReadRendererTests.swift b/Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/Proton/ProtonMarkAsReadRendererTests.swift rename to Source/Tests/Sieve Commands/Proton/MarkAsRead/ProtonMarkAsReadRendererTests.swift diff --git a/Source/Tests/Sieve Command/Proton/ProtonSpamCommandRendererTests.swift b/Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/Proton/ProtonSpamCommandRendererTests.swift rename to Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandRendererTests.swift diff --git a/Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandTests.swift b/Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandTests.swift new file mode 100644 index 0000000..b6028af --- /dev/null +++ b/Source/Tests/Sieve Commands/Proton/Spam/ProtonSpamCommandTests.swift @@ -0,0 +1,10 @@ +import Testing +@testable import Yasba + +struct ProtonSpamCommandTests { + @Test func requirements() throws { + let command = ProtonSpamCommand() + + #expect(command.requirements == ["include", "environment", "variables", "relational", "comparator-i;ascii-numeric", "spamtest"]) + } +} diff --git a/Source/Tests/Sieve Command/StopCommandRendererTests.swift b/Source/Tests/Sieve Commands/StopCommandRendererTests.swift similarity index 100% rename from Source/Tests/Sieve Command/StopCommandRendererTests.swift rename to Source/Tests/Sieve Commands/StopCommandRendererTests.swift diff --git a/Source/Tests/TestSupport.swift b/Source/Tests/TestSupport.swift index 6e5caec..19cab57 100644 --- a/Source/Tests/TestSupport.swift +++ b/Source/Tests/TestSupport.swift @@ -7,7 +7,6 @@ final class DummyLeaf: SieveCommand, SieveCommandValueEquatable { static let requirement: String = "requirement" let id: UUID - var isContainer: Bool { false } let text: String init(_ text: String, id: UUID = UUID()) { diff --git a/Source/Yasba/Sieve Commands/Core/Add Flag/AddFlagCommand.swift b/Source/Yasba/Sieve Commands/Core/Add Flag/AddFlagCommand.swift index 5b9afa8..f4b8883 100644 --- a/Source/Yasba/Sieve Commands/Core/Add Flag/AddFlagCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/Add Flag/AddFlagCommand.swift @@ -4,9 +4,7 @@ import Foundation @Observable final class AddFlagCommand: SieveCommand, SieveCommandValueEquatable { let id = UUID() - var tag: String - var isContainer: Bool { false } let requirements = ["imap4flags"] init(tag: String) { diff --git a/Source/Yasba/Sieve Commands/Core/File Into/FileIntoFolderCommand.swift b/Source/Yasba/Sieve Commands/Core/File Into/FileIntoCommand.swift similarity index 86% rename from Source/Yasba/Sieve Commands/Core/File Into/FileIntoFolderCommand.swift rename to Source/Yasba/Sieve Commands/Core/File Into/FileIntoCommand.swift index 8c4b393..d8ae0c9 100644 --- a/Source/Yasba/Sieve Commands/Core/File Into/FileIntoFolderCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/File Into/FileIntoCommand.swift @@ -6,10 +6,8 @@ import Foundation @Observable final class FileIntoCommand: SieveCommand, SieveCommandValueEquatable{ let id = UUID() - var mailbox: String - var isContainer: Bool { false } - var requirement: String = "fileinto" + let requirements = ["fileinto"] init(mailbox: String) { self.mailbox = mailbox diff --git a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift index b7e2145..0c9f673 100644 --- a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift @@ -42,7 +42,6 @@ final class IfCommand: SieveContainerCommand, SieveCommandValueEquatable { } var displayName: String { "If" } - var isContainer: Bool { true } func isSemanticallyEqual(to other: AnySieveCommand) -> Bool { guard let other = other as? IfCommand else { return false } diff --git a/Source/Yasba/Sieve Commands/Core/Stop/StopCommand.swift b/Source/Yasba/Sieve Commands/Core/Stop/StopCommand.swift index 636077e..3281346 100644 --- a/Source/Yasba/Sieve Commands/Core/Stop/StopCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/Stop/StopCommand.swift @@ -3,7 +3,6 @@ import Foundation @Observable final class StopCommand: SieveCommand, SieveCommandValueEquatable { let id = UUID() - var isContainer: Bool { return false } func isSemanticallyEqual(to other: AnySieveCommand) -> Bool { return other is StopCommand diff --git a/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift b/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift index 47560c4..8ff00d6 100644 --- a/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift +++ b/Source/Yasba/Sieve Commands/Extension/Proton/Expire/ProtonExpireCommand.swift @@ -3,9 +3,7 @@ import Foundation @Observable final class ProtonExpireCommand: SieveCommand, SieveCommandValueEquatable { let id = UUID() - var days: Int - var isContainer: Bool { false } let requirements = ["vnd.proton.expire"] init(days: Int) { diff --git a/Source/Yasba/Sieve Commands/Extension/Proton/MarkAsRead/ProtonMarkAsReadCommand.swift b/Source/Yasba/Sieve Commands/Extension/Proton/MarkAsRead/ProtonMarkAsReadCommand.swift index 608c162..fa5c409 100644 --- a/Source/Yasba/Sieve Commands/Extension/Proton/MarkAsRead/ProtonMarkAsReadCommand.swift +++ b/Source/Yasba/Sieve Commands/Extension/Proton/MarkAsRead/ProtonMarkAsReadCommand.swift @@ -3,8 +3,6 @@ import Foundation @Observable final class ProtonMarkAsReadCommand: SieveCommand, SieveCommandValueEquatable { let id = UUID() - - var isContainer: Bool { false } let requirements = ["imap4flags"] func isSemanticallyEqual(to other: AnySieveCommand) -> Bool { diff --git a/Source/Yasba/Sieve Commands/Extension/Proton/Spam/ProtonSpamCommand.swift b/Source/Yasba/Sieve Commands/Extension/Proton/Spam/ProtonSpamCommand.swift index d2056e4..b9a00c1 100644 --- a/Source/Yasba/Sieve Commands/Extension/Proton/Spam/ProtonSpamCommand.swift +++ b/Source/Yasba/Sieve Commands/Extension/Proton/Spam/ProtonSpamCommand.swift @@ -3,8 +3,6 @@ import Foundation @Observable final class ProtonSpamCommand: SieveCommand, SieveCommandValueEquatable { let id = UUID() - - var isContainer: Bool { false } let requirements = ["include", "environment", "variables", "relational", "comparator-i;ascii-numeric", "spamtest"] func isSemanticallyEqual(to other: AnySieveCommand) -> Bool { diff --git a/Source/Yasba/Sieve Commands/SieveCommand.swift b/Source/Yasba/Sieve Commands/SieveCommand.swift index 69f7891..4ebbf89 100644 --- a/Source/Yasba/Sieve Commands/SieveCommand.swift +++ b/Source/Yasba/Sieve Commands/SieveCommand.swift @@ -5,7 +5,6 @@ import Foundation */ protocol SieveCommand: AnyObject, Identifiable { var id: UUID { get } - var isContainer: Bool { get } var requirements: [String] { get } } From 82a1dd44c6655bd1a587766c23e6b5aa3118fb21 Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:33:33 +0200 Subject: [PATCH 6/7] Remove unused var --- Source/Yasba/Sieve Commands/Core/If/IfCommand.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift index 0c9f673..38ce074 100644 --- a/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift +++ b/Source/Yasba/Sieve Commands/Core/If/IfCommand.swift @@ -41,8 +41,6 @@ final class IfCommand: SieveContainerCommand, SieveCommandValueEquatable { self.elseChildren = elseChildren } - var displayName: String { "If" } - func isSemanticallyEqual(to other: AnySieveCommand) -> Bool { guard let other = other as? IfCommand else { return false } return quantifier == other.quantifier From ebebe661ee8603551617897b0d5c4c16985b393d Mon Sep 17 00:00:00 2001 From: Adam Borbas Date: Tue, 26 Aug 2025 14:35:24 +0200 Subject: [PATCH 7/7] Remove stub test template --- .../Yasba/Sieve Commands/Core/If/Rows/IfHeaderRowView.swift | 4 ---- .../Views/Sieve Script Builder/{ => Sidebar}/Sidebar.swift | 0 .../Sieve Script Builder/{ => Sidebar}/SidebarViewModel.swift | 0 3 files changed, 4 deletions(-) rename Source/Yasba/Views/Sieve Script Builder/{ => Sidebar}/Sidebar.swift (100%) rename Source/Yasba/Views/Sieve Script Builder/{ => Sidebar}/SidebarViewModel.swift (100%) diff --git a/Source/Yasba/Sieve Commands/Core/If/Rows/IfHeaderRowView.swift b/Source/Yasba/Sieve Commands/Core/If/Rows/IfHeaderRowView.swift index fea4952..f64b653 100644 --- a/Source/Yasba/Sieve Commands/Core/If/Rows/IfHeaderRowView.swift +++ b/Source/Yasba/Sieve Commands/Core/If/Rows/IfHeaderRowView.swift @@ -132,7 +132,6 @@ fileprivate enum TestTemplate: String, CaseIterable, Identifiable { case address case envelope case size - case body case exists var id: String { rawValue } @@ -143,7 +142,6 @@ fileprivate enum TestTemplate: String, CaseIterable, Identifiable { case .address: return "Address" case .envelope: return "Envelope" case .size: return "Size" - case .body: return "Body" case .exists: return "Exists" } } @@ -158,8 +156,6 @@ fileprivate enum TestTemplate: String, CaseIterable, Identifiable { return .envelope(part: .all, names: ["from"], match: .contains, keys: [""]) case .size: return .size(.over, bytes: 1024) - case .body: - return .exists(["Subject"]) case .exists: return .exists(["Subject"]) } diff --git a/Source/Yasba/Views/Sieve Script Builder/Sidebar.swift b/Source/Yasba/Views/Sieve Script Builder/Sidebar/Sidebar.swift similarity index 100% rename from Source/Yasba/Views/Sieve Script Builder/Sidebar.swift rename to Source/Yasba/Views/Sieve Script Builder/Sidebar/Sidebar.swift diff --git a/Source/Yasba/Views/Sieve Script Builder/SidebarViewModel.swift b/Source/Yasba/Views/Sieve Script Builder/Sidebar/SidebarViewModel.swift similarity index 100% rename from Source/Yasba/Views/Sieve Script Builder/SidebarViewModel.swift rename to Source/Yasba/Views/Sieve Script Builder/Sidebar/SidebarViewModel.swift