SAFE Stack アプリのデータ保存 (2. サーバのユーティリティー関数)
SAFE Stack の ToDo アプリはデータを保存できるようにする続き。
目的の処理を実装する前に、ユーティリティー的な関数を実装した。 実装先のファイルは新しく 1 個追加して src/Server/ServerUtil.fs にする。 汎用的な処理はアプリケーション固有のそれと分けるのがよいと思うので、 src/Server/Server.fs と別のファイルにした。
src/Server/ServerUtil.fs
namespace ServerUtil
module StringUtil =
open System.Text.RegularExpressions
let stripHead s = Regex("^\s+").Replace(s, "")
let stripTail s = Regex("\s+$").Replace(s, "")
let strip = stripHead >> stripTail
module EnvUtil =
open System
let getEnv name = name |> Environment.GetEnvironmentVariable |> string
module IoUtil =
open System
open System.IO
let docRoot () = Environment.GetFolderPath Environment.SpecialFolder.Personal
let dirSepChar = Path.DirectorySeparatorChar
let dirSepStr = string dirSepChar
let isAbsPath (path: string) = path.Length > 0 && path.[0] = dirSepChar
let checkFile (filePath: string) =
File.Exists filePath
let assureDir (dirPath: string) =
// Memo:
// - "Directory.CreateDirectory" is almost equivalent to "mkdir -p"
Directory.CreateDirectory dirPath |> ignore
いくつか補足する。
Environment.GetEnvironmentVariable は対象の環境変数が不在のときに、 null を返してくる。
この挙動は順当だけど、 F# の文字列で null の可能性を意識するのは嫌過ぎるので、ここでは string 関数に渡して空文字列にしてしまっている。
string option 型にして null のときは None にする方法もあるけど、環境変数を扱うときは未定義と空文字列と区別しないことが多いと思うので string 型に丸めてしまった。
Environment.GetFolderPath Environment.SpecialFolder.Personal は Unix 系の環境ではホームディレクトリを返してくれた。
Windows 環境ではマイドキュメントになるらしい。
Path.DirectorySeparatorChar はパスの区切り文字で、 Unix 系の環境では当然 ='/'= が返される。
Windows 環境では ='/'= になるのだろう。