型を指定してバイナリから変換するライブラリ

誰得なライブラリな気がするので、微妙ですが ...

作った理由

Erlang で外部 API とかを使って Console とかからデータを貰えるような仕組みを作ると、
かならず必要なのがバリデータとかコンバーターです。

毎回似たようなの書いててだるいなぁって思っていたので、ライブラリ化してみました。

ただ、Erlang で外部向けの API をつくったりしないかぎりは、使いどころがあまりないライブラリです。

github

pull-request 待ってます。

https://github.com/voluntas/satori

型の種類

単体では使い道無いので、 rebar の deps で呼んで貰うイメージです。

bitstring に対してバリデータ + 型変換を行って戻り値を返してくれます。

  • binary
  • binary extend
  • integer
  • atom

今のところ 4 タイプに対応しています。regexp も追加する予定です。

binary type

binary の長さのバリデーションが指定可能です。
固定で対応文字列範囲で 0x20 ~ 0x7E までの文字を許可します \00 とかはダメです。

{binary, {最小サイズ,最大サイズ}

サンプル

> satori:convert({binary, {1, 2}}, <<"ab">>).
<<"ab">>
> satori:convert({binary, {1, 2}}, <<"abc">>).
invalid_input

binary extend type

binary と一緒ですが許可する文字範囲を自分で指定出来ます。さらに、許可しない文字も指定出来ます。

{binary, {最小サイズ, 最大サイズ}, {文字範囲スタート, 文字範囲エンド}, [許可しない文字]}

以下は 0x20 ~ 0x7E なのだけれど , は許可しないという設定をしている例です。

> satori:convert({binary, {1, 5}, {16#20, 16#7E}, [$,]}, <<"abc">>).
<<"abc">>
> satori:convert({binary, {1, 5}, {16#20, 16#7E}, [$,]}, <<"a,c">>).
invalid_input
> satori:convert({binary, {1, 5}, {16#20, 16#7E}, [$,]}, <<"\0\1\3">>).
invalid_input

integer type

数値変換です。マイナスも大丈夫です。
最小値と最大値が指定出来てバリデーション可能です。

{integer, {最小値, 最大値}}

> satori:convert({integer, {1, 32}}, <<"12">>).
12
> satori:convert({integer, {1, 32}}, <<"33">>).
invalid_input
> satori:convert({integer, {1, 32}}, <<"a">>).
invalid_input

atom type

atom に変換も入れてあります。
ただ atom の動的生成はメモリーリークの原因になりますので、変換する際 binary_to_existing_atom を使っています。
既に存在する atom 以外を変換しようとしたら例外が上がります。それでメモリリークを防いでいます。

またリストで atom を渡す事で、指定した atom 以外は変換出来ないようにしています。

{atom, [atom]}

> satori:convert({atom, [spam]}, <<"spam">>).
spam
> satori:convert({atom, [spam]}, <<"egg">>).
invalid_input

名前の由来

妖怪から取ってます。ライブラリ作るとき名前は出来るだけ日本にまつわる名前にしてます。

http://ja.wikipedia.org/wiki/%E8%A6%9A

雑感

1 時間くらいで書いたのですが、あったらいいなーと思った割にさくっと書きました。
あんまり需要は無いと思いますが、自分が嬉しいのでいいかなと。

今後は気軽に拡張出来るように拡張機能を強化していこうかなと。
ただシンプルにしていきたいので何かのアプリ依存な変換機能とかは付ける予定はありません。

参考

  • 特にないですが @itawasa のアイデアをぱくりました。