maxep 6 жил өмнө
parent
commit
6f50e117a2

+ 9 - 4
Sources/KeePass/Entry.swift

@@ -24,13 +24,18 @@ public let EntryFieldPassword = "Password"
 public let EntryFieldURL      = "URL"
 public let EntryFieldNotes    = "Notes"
 
-public protocol Entry: RandomAccessCollection where Element == Field, Index == Int {
-    mutating func set(_ field: Element)
+public protocol Entry {
+
+    associatedtype Fields: RandomAccessCollection where Fields.Element == Field
+
+    var fields: Fields { get }
+    
+    mutating func set(_ field: Fields.Element)
 }
 
 extension Entry {
 
-    subscript(_ field: String) -> Element? {
-        return first(where: { $0.name == field })
+    subscript(_ field: String) -> Fields.Element? {
+        return fields.first(where: { $0.name == field })
     }
 }

+ 9 - 28
Sources/KeePass/KDB.swift

@@ -24,7 +24,7 @@ extension KDB.Database: Database {
 
 }
 
-extension KDB.Field where Type == KDB.Entry.`Type` {
+extension KDB.Property where Type == KDB.Entry.`Type` {
 
     init?(_ field: Field) {
 
@@ -53,38 +53,21 @@ extension KDB.Field where Type == KDB.Entry.`Type` {
 extension KDB.Group: Group {
 
     public var title: String {
-        get { self[.name] ?? "" }
-        set { self[.name] = newValue }
-    }
-
-    public var icon: Int {
-        get { self[.iconID] ?? 0 }
-        set { self[.iconID] = newValue }
+        get { name }
+        set { name = newValue }
     }
 
     public var groups: [KDB.Group] { childs }
 }
 
 extension KDB.Entry: Entry {
-
-    public subscript(position: Int) -> Field {
-        Field( fields[position] )
-    }
-
-    public var startIndex: Int {
-        fields.startIndex
-    }
-
-    public var endIndex: Int {
-        fields.endIndex
-    }
-
-    public func index(after i: Int) -> Int {
-        fields.index(after: i)
+    
+    public var fields: [Field] {
+        properties.compactMap { Field($0) }
     }
 
     public func set(_ field: Field) {
-        guard let field = KDB.Field(field) else { return }
+        guard let field = KDB.Property(field) else { return }
         set(field)
     }
 
@@ -92,7 +75,7 @@ extension KDB.Entry: Entry {
 
 extension Field {
 
-    init(_ field: KDB.Field<KDB.Entry.`Type`>) {
+    init?(_ field: KDB.Property<KDB.Entry.`Type`>) {
 
         switch field.type {
         case .title:
@@ -116,9 +99,7 @@ extension Field {
             isReadeOnly = false
             isProtected = false
         default:
-            name = ""
-            isReadeOnly = true
-            isProtected = false
+            return nil
         }
 
         value = try? field.get()

+ 5 - 17
Sources/KeePass/KDBX.swift

@@ -22,7 +22,7 @@ import XML
 import KDBX
 
 extension KDBX.File: Database {
-    public var root: Element { database.document.root }
+    public var root: Element { database.document.root.KeePassFile.Root }
 }
 
 extension Element {
@@ -49,27 +49,15 @@ extension Field {
 
 extension XML.Element: Entry {
 
+    public var fields: [Field] {
+        allDescendants(where: { $0.name == "String" }).map { Field($0) }
+    }
+
     public func set(_ field: Field) {
         allDescendants(where: { $0.name == field.name })
             .forEach { $0.removeFromParent() }
         addChild( XML.Element(field) )
     }
-
-    public subscript(position: Int) -> Field {
-        Field( children[position] )
-    }
-
-    public func index(after i: Int) -> Int {
-        children.index(after: i)
-    }
-
-    public var startIndex: Int {
-        children.startIndex
-    }
-
-    public var endIndex: Int {
-        children.endIndex
-    }
 }
 
 extension XML.Element: Group {

+ 8 - 70
Sources/KeePass/TypeErasure.swift

@@ -32,20 +32,15 @@ internal class _AnyDatabaseBoxBase: Database {
 internal final class _AnyDatabaseBox<Base>: _AnyDatabaseBoxBase where Base: Database {
     internal override var root: AnyGroup { AnyGroup( _base.root ) }
     internal var _base: Base
-    internal init(_ base: Base) {
-        self._base = base
-    }
+    internal init(_ base: Base) { _base = base }
 }
 
 public class AnyDatabase: Database {
-
     public var root: AnyGroup { _box.root }
-
     internal let _box: _AnyDatabaseBoxBase
     internal init<T>(_ base: T) where T: Database {
         _box = _AnyDatabaseBox(base)
     }
-    
 }
 
 // MARK: - Group
@@ -82,9 +77,7 @@ internal final class _AnyGroupBox<Base>: _AnyGroupBoxBase where Base: Group {
     internal override var groups: AnyRandomAccessCollection<AnyGroup> { AnyRandomAccessCollection<AnyGroup>(_base.groups.map { AnyGroup($0) }) }
 
     internal var _base: Base
-    internal init(_ base: Base) {
-        self._base = base
-    }
+    internal init(_ base: Base) { _base = base }
 }
 
 public class AnyGroup: Group {
@@ -106,82 +99,27 @@ public class AnyGroup: Group {
     internal init<T>(_ base: T) where T: Group {
         _box = _AnyGroupBox(base)
     }
-
 }
 
 // MARK: - Entry
 
 internal class _AnyEntryBoxBase: Entry {
-    internal subscript(position: Int) -> Field { _abstract() }
-    internal var startIndex: Int { _abstract() }
-    internal var endIndex: Int { _abstract() }
-    internal func index(after i: Int) -> Int { _abstract() }
-    internal func index(before i: Int) -> Int { _abstract() }
+    internal var fields: AnyRandomAccessCollection<Field> { _abstract() }
     internal func set(_ field: Field) { _abstract() }
 }
 
 internal final class _AnyEntryBox<Base>: _AnyEntryBoxBase where Base: Entry {
-
-    internal override subscript(position: Int) -> Element {
-        _base[position]
-    }
-
-    internal override var startIndex: Int {
-        _base.startIndex
-    }
-
-    internal override var endIndex: Int {
-        _base.endIndex
-    }
-
-    internal override func index(after i: Int) -> Int {
-        _base.index(after: i)
-    }
-
-    internal override func index(before i: Int) -> Int {
-        _base.index(before: i)
-    }
-
-    internal override func set(_ field: Element) {
-        _base.set(field)
-    }
-
+    internal override var fields: AnyRandomAccessCollection<Field> { AnyRandomAccessCollection<Field>(_base.fields) }
+    internal override func set(_ field: Field) { _base.set(field) }
     internal var _base: Base
-    internal init(_ base: Base) {
-        self._base = base
-    }
-
+    internal init(_ base: Base) { _base = base }
 }
 
 public final class AnyEntry: Entry {
-
-    public subscript(position: Int) -> Field {
-        _box[position]
-    }
-
-    public var startIndex: Int {
-        _box.startIndex
-    }
-
-    public var endIndex: Int {
-        _box.endIndex
-    }
-
-    public func index(after i: Int) -> Int {
-        _box.index(after: i)
-    }
-
-    public func index(before i: Int) -> Int {
-        _box.index(before: i)
-    }
-
-    public func set(_ field: Field) {
-        _box.set(field)
-    }
-
+    public var fields: AnyRandomAccessCollection<Field> { _box.fields }
+    public func set(_ field: Field) { _box.set(field) }
     internal let _box: _AnyEntryBoxBase
     internal init<T>(_ base: T) where T: Entry {
         _box = _AnyEntryBox(base)
     }
-
 }