Files

63 lines
1.8 KiB
Swift

// SPDX-FileCopyrightText: 2026 Kaede Akino
// SPDX-License-Identifier: GPL-3.0-only
import Foundation
public nonisolated struct RemoteFile: Identifiable, Hashable, Sendable {
public nonisolated enum Kind: String, Hashable, Sendable {
case file, directory, symbolicLink, special, unknown
}
public var path: String
public var name: String
public var kind: Kind
public var size: Int64
public var modifiedAt: Date?
public var permissions: UInt32
public var ownerUID: UInt32
public var ownerGID: UInt32
public var id: String { path }
public var isDirectory: Bool { kind == .directory }
public var isHidden: Bool { name.hasPrefix(".") }
public var permissionMode: UInt32 { permissions & 0o7777 }
public var octalPermissionDescription: String {
String(format: "%04o", permissionMode)
}
public var permissionDescription: String {
let type: Character =
switch kind {
case .file: "-"
case .directory: "d"
case .symbolicLink: "l"
case .special: "s"
case .unknown: "?"
}
let masks: [UInt32] = [0o400, 0o200, 0o100, 0o040, 0o020, 0o010, 0o004, 0o002, 0o001]
let letters: [Character] = ["r", "w", "x", "r", "w", "x", "r", "w", "x"]
return String([type] + zip(masks, letters).map { permissions & $0.0 == 0 ? "-" : $0.1 })
}
public init(
path: String,
name: String,
kind: Kind,
size: Int64,
modifiedAt: Date? = nil,
permissions: UInt32,
ownerUID: UInt32,
ownerGID: UInt32
) {
self.path = path
self.name = name
self.kind = kind
self.size = size
self.modifiedAt = modifiedAt
self.permissions = permissions
self.ownerUID = ownerUID
self.ownerGID = ownerGID
}
}