allow sispare-from-jisho to handle words with only readings
[sispare.git] / util.myr
blob5a3a83e57400117551ec6abb08f5b6ab77649060
1 use std
2 use fileutil
4 pkg =
5         const get_basedir : (explicitly_provided : byte[:] -> std.result(byte[:], byte[:]))
6 ;;
8 const get_basedir = { explicitly_provided : byte[:]
9         var try_dir : byte[:] = [][:]
11         if explicitly_provided.len > 0
12                 match std.diropen(explicitly_provided)
13                 | `std.Ok d2:
14                         std.dirclose(d2)
15                         -> `std.Ok std.sldup(explicitly_provided)
16                 | `std.Err e:
17                         -> `std.Err std.fmt("dtd.diropen(\"{}\"): {}", explicitly_provided, e)
18                 ;;
19         ;;
21         /* Try to open the XDG one */
22         
23         match std.getenv("XDG_DATA_HOME")
24         | `std.None:
25         | `std.Some d:
26                 try_dir = std.pathjoin([d, "sispare"][:])
27                 match std.diropen(try_dir)
28                 | `std.Ok d2:
29                         std.dirclose(d2)
30                         -> `std.Ok try_dir
31                 | `std.Err _:
32                 ;;
33         ;;
35         std.slfree(try_dir)
36         try_dir = [][:]
38         /* Try to open the $HOME one */
39         try_dir = std.pathjoin([ fileutil.homedir(), ".sispare" ][:])
40         match std.diropen(try_dir)
41         | `std.Ok d2:
42                 std.dirclose(d2)
43                 -> `std.Ok try_dir
44         | `std.Err _:
45         ;;
47         std.slfree(try_dir)
48         try_dir = [][:]
50         -> `std.Err std.fmt("cannot open any directories\nRun something like\n\n    mkdir -p ${{XDG_DATA_HOME}}/sispare    # or\n    mkdir -p ${{HOME}}/.sispare\n\nor provide one with -d")