dieselで条件に基づいたクエリを構築する

diesel 小ネタ。

参考: https://github.com/diesel-rs/diesel/issues/455

やりたいこと

数字の ID でも文字列の slug でも1つの関数で検索できるようにしたい。

pub enum IdOrSlug {
    Id(i32),
    Slug(String),
}

// ...

pub fn find(..., id: IdOrSlug) -> Result<Article> {
    let query = articles::table.left_join(categories::table);
    let query = match id {
        IdOrSlug::Id(id) => query.filter(articles::id.eq(id)),
        IdOrSlug::Slug(slug) => query.filter(articles::slug.eq(slug.as_str())),
    };

    // ...

ダメっぽい

.filter() をかますと引数の型が戻り値の型に埋め込まれるようで、 incompatible だと怒られる。

match arms have incompatible types

expected struct `schema::articles::columns::id`, found struct `schema::articles::columns::slug`

note: expected type `diesel::query_builder::SelectStatement<_, _, _, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<schema::articles::columns::id, diesel::expression::bound::Bound<diesel::sql_types::Integer, i32>>>>`
       found struct `diesel::query_builder::SelectStatement<_, _, _, diesel::query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<schema::articles::columns::slug, diesel::expression::bound::Bound<diesel::sql_types::Text, &str>>>>`

プログラム意味論のお勉強

ふと思い出しては何かを読んで、挫折してを繰り返しているのでいつまで経っても理解できていない。 けど、悔しいのでたぶん今後もチャレンジしていくと思うので自分用のリストを作っておく。

ウェブ

書籍

  • プログラミング言語の基礎概念 / 五十嵐 淳 / サイエンス社
  • プログラム意味論 / 横内 筧文 / 共立出版株式会社

中身を型で表現するコンテナを作ろうとした

結果

自分には思い通りのものを作ることはできなかった。

やりたいこと(やりたかったこと)

以下みたいなことを実現したい。

  • 型をキーとした HashMap
  • 値を与えると格納される
  • 型を指定することで値を取り出せる
  • 保管していない型を指定した場合は コンパイルエラー が発生
let bag = Basket::new();
bag.set("Universe");
bag.set(42);

println!("i32: {}", bag.get::<i32>());   // => "i32: 42"
println!("&str: {}", bag.get::<&str>()); // => "&str: Universe"

// println!("bool: {}", bag.get::<bool>()); => Compile Error!