Rust

Rustで『デザインパターン入門 マルチスレッド編』を再実装した

少し古いが、結城浩先生の『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』という本がある。 www.hyuki.com RustでasyncAsync BookやTokioのドキュメントを読もうとして、Rustのstdに入っているsyncモジュールやtheradモジュールの使い…

Rustで$refを使うJSON Schemaを作成してバリデーションする

次のようなJSON Schemaがあるとする。 { "type": "object", "properties": { "foo": { "$ref": "#/definitions/foo" } }, "required": [ "foo" ] } $refでJSON Pointer "#/definitions/foo"によって参照しているスキーマは内部に存在してほしいが、なぜか今…

async-graphqlで独自の名前とフィールドを持つconnection/edgeを定義する

GraphQLで、適切にグラフ上のノード間の関係を示すために、connectionやedgeに独自の名前をつけて、独自のフィールドも追加したいことがある。 Explaining GraphQL Connections | Apollo GraphQL Blog Instead think of them as the relationship between tw…

RustでTestcontainers入門: テストコードから依存サービスを起動してテスト環境を作成する

この記事はRust Advent Calendar 2023 シリーズ1の4日目の記事です。 あるソフトウェアをテストするとき、そのソフトウェアがデータベースやメッセージブローカのような外部のサービスに依存する場合に、その依存をどのように扱うかという問題がつきまとう。…

RustでTiberiusを使ってSQL Serverのコンテナに接続する

Microsoftが提供しているSQL ServerのDockerイメージを使うと、デフォルト設定では無料のSQL Server Developer Editionのコンテナを起動できる。 learn.microsoft.com このコンテナに対してRustからクエリを発行したい。Rustでは、SQL Serverのクライアント…

宣言的マクロでfor内包表記を部分的に実装する

Rustの宣言的マクロ(declarative macro)でScalaのfor内包表記(for comprehension)を部分的に実装してみた。Scalaの for { x <- xs y <- ys } yield doSomething(x, y) をRustで for_vec! { x <- xs, y <- ys; do_something(x, y) } のように書けるようにする…

Axumのハンドラで任意で渡されるクエリパラメータを受け取る

たとえばAxumのハンドラでクエリパラメータ page を受け付けるときに、 page=1が付与されていれば値として1を使う page=aのように値が無効ならデフォルト値を使う pageが付与されていないならデフォルト値を使う page=のように値が空ならデフォルト値を使う …

SQLxでテスト実行時にDBのデータを管理する

RDBをデータストアとして使うWebアプリケーション(のバックエンド)の開発で、テストを通じてDBに作成したレコードを自動で削除できると、開発環境のDBが汚れず、また他のテストによって変更されたDBの状態に影響されないので便利。Rustではこれをどうやる…