enum Figma {
typealias Language = String typealias PageId = String struct Child: Codable { let id: PageId let name: String } struct Pages: Codable { struct Node: Codable { struct Document: Codable { let name: String let children: [Child] } let document: Document } let name: String let nodes: [PageId: Node] } struct Screen { let id: PageId let locale: Language let page: Int let device: Device }
}
extension Figma.Child {
func screen() -> Figma.Screen? { let cmp = self.name.components(separatedBy: "/") guard cmp.count == 4, cmp[0] == "screen", let device = Device(rawValue: cmp[2]), let page = Int(cmp[3]) else { return nil } return Figma.Screen(id: self.id, locale: cmp[1], page: page, device: device) }
}
extension Figma.Screen {
var fileName: String { "\(self.device.id)_\(self.page).jpg" }
}
extension Figma.Pages {
func screens(for page: String) -> [Figma.Screen] { var screens = [Figma.Screen]() if let node = self.nodes[page] { screens = node.document.children.compactMap { $0.screen() } } return screens }
}