// // PolicySnapshot.swift // Tun // // Created by Codex on 2026/5/20. // import Foundation final class PolicySnapshot: Snapshot { private let identitySnapshot: IdentitySnapshot init(identitySnapshot: IdentitySnapshot) { self.identitySnapshot = identitySnapshot } func allows(srcIdentityID: UInt32, ipPacket: IPPacket) -> Bool { let ruleMap = self.identitySnapshot.lookup(srcIdentityID) let proto = ipPacket.header.proto switch ipPacket.transportPacket { case .tcp(let tcpPacket): return ruleMap?.isAllow(proto: proto, port: tcpPacket.header.dstPort) ?? false case .udp(let udpPacket): return ruleMap?.isAllow(proto: proto, port: udpPacket.dstPort) ?? false case .icmp: return true default: return false } } static func empty() -> PolicySnapshot { return PolicySnapshot(identitySnapshot: .empty()) } }