⛏️

Rustでtypescriptのstring literal typeみたいなことをやりたいときはどうする

2024/09/10に公開

typescriptのstring literal type

type Animal = 'cat' | 'dog'

このような型定義をRustでやりたい。具体的にはRustのdeserializeするためのstruct定義で行いたい。

Enumを使った方法

serde_jsonを使用して文字列をBlockというstructにdeserializeする流れ。
特にdeselializeの処理を独自に実装する必要などはなかった。

use serde_derive::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
enum Animal {
    Cat,
    Dog,
}

#[derive(Debug, Serialize, Deserialize)]
struct Block {
    animal: Animal,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let json = r#"{ "animal": "Cat" }"#;
    let b: Block = serde_json::from_str(json)?;
    println!("{:?}", b);
    Ok(())
}

出力結果

Block { animal: Cat }

Discussion