From 5c12edfd4b263c562eec9de1a0b5d5e80759ae95 Mon Sep 17 00:00:00 2001 From: Leo Dion Date: Mon, 14 Oct 2024 22:29:45 -0400 Subject: [PATCH] Adding Queryable --- .../DataThespian/Databases/Queryable.swift | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Sources/DataThespian/Databases/Queryable.swift diff --git a/Sources/DataThespian/Databases/Queryable.swift b/Sources/DataThespian/Databases/Queryable.swift new file mode 100644 index 0000000..2acd010 --- /dev/null +++ b/Sources/DataThespian/Databases/Queryable.swift @@ -0,0 +1,67 @@ +// +// Queryable.swift +// DataThespian +// +// Created by Leo Dion on 10/14/24. +// + +public import SwiftData +public import Foundation + +public enum Selector : Sendable { + public enum Delete : Sendable{ + case predicate(Predicate) + case all + case model(Model) + } + public enum List : Sendable{ + case descriptor(FetchDescriptor) + } + public enum Get : Sendable{ + case model(Model) + case predicate(Predicate) + } +} + +public protocol Queryable { + func insert( + _ closuer: @Sendable @escaping () -> PersistentModelType, + with closure: @escaping @Sendable (PersistentModelType) throws -> U + ) async -> Model + + func get( + for selector: Selector.Get, + with closure: @escaping @Sendable (PersistentModelType?) throws -> U + ) async rethrows -> U + + func fetch( + for selector: Selector.List, + with closure: @escaping @Sendable ([PersistentModelType]) throws -> U + ) async rethrows -> U + + func delete(_ selector: Selector.Delete) async throws +} + +extension Queryable { + func insert( + _ closuer: @Sendable @escaping () -> PersistentModelType + ) async -> Model { + await self.insert(closuer, with: Model.init) + } + + func get( + for selector: Selector.Get + ) async -> Model? { + await self.get(for: selector) { persistentModel in + persistentModel.flatMap(Model.init) + } + } + + func fetch( + for selector: Selector.List + ) async -> [Model] { + await self.fetch(for: selector) { persistentModels in + persistentModels.map(Model.init) + } + } +}