specta-swift 0.0.3

Export your Rust types to Swift
Documentation
// Generated by MyApp - Custom Header
import Foundation

public enum api_result<T> {
    case success(api_resultSuccessData)
    case error(api_resultErrorData)
    case loading(api_resultLoadingData)
}
public struct api_resultSuccessData: Codable {
    public let data: T
    public let status: UInt16
}

public struct api_resultErrorData: Codable {
    public let message: String
    public let code: UInt32
}

public struct api_resultLoadingData: Codable {
    public let progress: Float
}

// MARK: - api_result Codable Implementation
extension api_result: Codable {
    private enum CodingKeys: String, CodingKey {
        case success = "Success"
        case error = "Error"
        case loading = "Loading"
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        if container.allKeys.count != 1 {
            throw DecodingError.dataCorrupted(
                DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Invalid number of keys found, expected one.")
            )
        }

        let key = container.allKeys.first!
        switch key {
        case .success:
            let data = try container.decode(api_resultSuccessData.self, forKey: .success)
            self = .success(data)
        case .error:
            let data = try container.decode(api_resultErrorData.self, forKey: .error)
            self = .error(data)
        case .loading:
            let data = try container.decode(api_resultLoadingData.self, forKey: .loading)
            self = .loading(data)
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        
        switch self {
        case .success(let data):
            try container.encode(data, forKey: .success)
        case .error(let data):
            try container.encode(data, forKey: .error)
        case .loading(let data):
            try container.encode(data, forKey: .loading)
        }
    }
}


public struct user: Codable {
    public let id: UInt32
    public let name: String
    public let email: Optional<String>
    public let role: user_role
}

public enum user_role {
    case guest
    case user(user_roleUserData)
    case admin(user_roleAdminData)
    case super_admin(user_roleSuperAdminData)
}
public struct user_roleUserData: Codable {
    public let permissions: [String]
}

public struct user_roleAdminData: Codable {
    public let level: UInt8
    public let department: String
}

public struct user_roleSuperAdminData: Codable {
    public let access_level: UInt32
}

// MARK: - user_role Codable Implementation
extension user_role: Codable {
    private enum CodingKeys: String, CodingKey {
        case guest = "Guest"
        case user = "User"
        case admin = "Admin"
        case super_admin = "SuperAdmin"
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        if container.allKeys.count != 1 {
            throw DecodingError.dataCorrupted(
                DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Invalid number of keys found, expected one.")
            )
        }

        let key = container.allKeys.first!
        switch key {
        case .guest:
            self = .guest
        case .user:
            let data = try container.decode(user_roleUserData.self, forKey: .user)
            self = .user(data)
        case .admin:
            let data = try container.decode(user_roleAdminData.self, forKey: .admin)
            self = .admin(data)
        case .super_admin:
            let data = try container.decode(user_roleSuperAdminData.self, forKey: .super_admin)
            self = .super_admin(data)
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        
        switch self {
        case .guest:
            try container.encodeNil(forKey: .guest)
        case .user(let data):
            try container.encode(data, forKey: .user)
        case .admin(let data):
            try container.encode(data, forKey: .admin)
        case .super_admin(let data):
            try container.encode(data, forKey: .super_admin)
        }
    }
}