Skip to main content

llama_cpp_bindings/
gguf_type.rs

1//! GGUF value types.
2
3/// The type of a value stored in a GGUF key-value pair.
4#[repr(u32)]
5#[derive(Copy, Clone, Debug, PartialEq, Eq)]
6pub enum GgufType {
7    /// 8-bit unsigned integer
8    Uint8 = 0,
9    /// 8-bit signed integer
10    Int8 = 1,
11    /// 16-bit unsigned integer
12    Uint16 = 2,
13    /// 16-bit signed integer
14    Int16 = 3,
15    /// 32-bit unsigned integer
16    Uint32 = 4,
17    /// 32-bit signed integer
18    Int32 = 5,
19    /// 32-bit floating point
20    Float32 = 6,
21    /// Boolean
22    Bool = 7,
23    /// String
24    String = 8,
25    /// Array
26    Array = 9,
27    /// 64-bit unsigned integer
28    Uint64 = 10,
29    /// 64-bit signed integer
30    Int64 = 11,
31    /// 64-bit floating point
32    Float64 = 12,
33}
34
35impl GgufType {
36    /// Converts from the raw `gguf_type` value. Returns None for unknown types.
37    #[must_use]
38    pub const fn from_raw(value: llama_cpp_bindings_sys::gguf_type) -> Option<Self> {
39        match value {
40            0 => Some(Self::Uint8),
41            1 => Some(Self::Int8),
42            2 => Some(Self::Uint16),
43            3 => Some(Self::Int16),
44            4 => Some(Self::Uint32),
45            5 => Some(Self::Int32),
46            6 => Some(Self::Float32),
47            7 => Some(Self::Bool),
48            8 => Some(Self::String),
49            9 => Some(Self::Array),
50            10 => Some(Self::Uint64),
51            11 => Some(Self::Int64),
52            12 => Some(Self::Float64),
53            _ => None,
54        }
55    }
56
57    /// Converts to the raw `gguf_type` value.
58    #[must_use]
59    pub const fn to_raw(self) -> llama_cpp_bindings_sys::gguf_type {
60        self as llama_cpp_bindings_sys::gguf_type
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::GgufType;
67
68    #[test]
69    fn from_raw_maps_all_known_types() {
70        assert_eq!(GgufType::from_raw(0), Some(GgufType::Uint8));
71        assert_eq!(GgufType::from_raw(1), Some(GgufType::Int8));
72        assert_eq!(GgufType::from_raw(2), Some(GgufType::Uint16));
73        assert_eq!(GgufType::from_raw(3), Some(GgufType::Int16));
74        assert_eq!(GgufType::from_raw(4), Some(GgufType::Uint32));
75        assert_eq!(GgufType::from_raw(5), Some(GgufType::Int32));
76        assert_eq!(GgufType::from_raw(6), Some(GgufType::Float32));
77        assert_eq!(GgufType::from_raw(7), Some(GgufType::Bool));
78        assert_eq!(GgufType::from_raw(8), Some(GgufType::String));
79        assert_eq!(GgufType::from_raw(9), Some(GgufType::Array));
80        assert_eq!(GgufType::from_raw(10), Some(GgufType::Uint64));
81        assert_eq!(GgufType::from_raw(11), Some(GgufType::Int64));
82        assert_eq!(GgufType::from_raw(12), Some(GgufType::Float64));
83    }
84
85    #[test]
86    fn from_raw_returns_none_for_unknown() {
87        assert_eq!(GgufType::from_raw(99), None);
88        assert_eq!(GgufType::from_raw(u32::MAX), None);
89    }
90
91    #[test]
92    fn to_raw_roundtrips() {
93        for raw in 0..=12 {
94            let gguf_type = GgufType::from_raw(raw).unwrap();
95            assert_eq!(gguf_type.to_raw(), raw);
96        }
97    }
98}