summaryrefslogtreecommitdiff
path: root/Readme.md
blob: c1cd707bcee411f2bd6031a694a2bcccbe38c52a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# walint: lint & adjust workadventure maps

`walint` is intended as a simple linter that will check workadventure maps for
common errors, such as non-existent map entrypoints or missing asset files, and
additionally suggest changes to improve accessability.

Optionally, it can also *adjust* maps — e.g. to automatically insert property 
values or help enforce an event's map policies — and then write them out again,
copying all needed assets and minifying the map's json.

## Usage
``` sh
walint --config-file config.json --repository path \
      [--out path] [--json] [--pretty] [--entrypoint main.json]

```

### Options
 - `--repository`: path to a map repository
 - `--entrypoint`: entrypoint of a map repository, i.e. a tiled map in its root
   directory. `walint` will lint all maps reachable from it. If not given, it
   defaults to `main.json`
 - `--lintLevel`: limit output only to messages that have at most the given
   level. Valid levels are `Info`, `Suggestion`, `Warning`, `Forbidden`, `Error`,
   `Fatal`. Defaults to `Suggestion` if not given.
 - `--json`: print output as json instead of the normal more human-friendly format
 - `--pretty`: if used with `--json`, insert line breaks and indentation to make
   the output more readable. Otherwise no effect.
 - `--out path`: write the linted & adjusted repository to the given path. Any
   json written to this path will be minimised, and *only those maps and assets
   which are reachable from the entrypoint* will be writen at all. If not given,
   `walint` will only run the linter and do nothing else. If `walint` encounters
   any references to local map assets which are not present in the repository, 
   or if the map generates lints above the maximum lint level, it will instead
   exit with code 1 without touching the output path at all.
 - `--config-file file`: path to a configuation file. Required (for now).
 - `--config json`: takes a string which should contain a json object conforming
   to the same schema as the configuration file, except that all keys are 
   optional. Keys given here will override whatever values are set in the 
   configuration file.

### Configuation
Take a look at `config.json` for an example. Most keys are required, and do not
have default values.

For the schema, take a look at the definition of the `LintConfig` type in
`lib/LintConfig.hs`; I'll attempt to remember documenting options there (if you
are unfamiliar with Haskell: key names come first, though there are all prepended
with `config` here. Types come after the `::`; ignore the `HKD f` bit and look
at whatever comes after that. Most types should be self-explanatory; Note that
you may leave out keys whose type includes `Maybe`)


### Output
By default `walint` prints lints in a hopefully human-readable manner. Its exit
code will be 1 if the maximum lint level set in its config was exceeded, and 0
otherwise. Only in the latter case will it write out an adjusted map respository
to the path passed to `--out`.

If the `--json` option is given, output to stdout will be printed as json, which
should conform to the following schema (here defined in a quasi-haskell syntax):

```haskell
-- | The main type of walint's output
type Output = 
  { mapLints :: Map FilePath MapLint
  -- ^ an object of per-map lints. Each key is a filepath from the repository's root
  , missingAssets :: List Asset
  -- ^ a list of missing assets
  , missingDeps :: List Entrypoint
  -- ^ a list of other missing dependencies (for now, just entrypoints)
  }

-- | An object containing map lints
type MapLint =
  { general :: List Lint 
  -- ^ general lints (most often empty)
  , layer :: Map Message Where
  -- ^ an object of per-layer lints. Each key is a lint message
  , tileset :: Map Message Where
  -- ^ an object of per-tileset lints. Again, each key is a lint message
  }

-- | Further desription of a single lint
type Where =
  { in :: List String
  -- ^ where did this lint occur? (list of layers / tileset names)
  , level :: Level
  -- ^ what is this lint's level?
  }
  
-- | Valid lint levels. Encoded as strings, listed in order here.
data Level = Info | Suggestion | Warning | Forbidden | Error | Fatal


-- | description of a single (missing) asset
type Asset =
  { asset :: FilePath
  -- ^ the filename, as referenced somewhere within the repository
  , neededBy :: List FilePath
  -- ^ list of filenames of maps which reference this asset
  }

-- | description of a single (missing) entrypoint
type Entrypoint =
  { entrypoint :: String
  -- ^ the entrypoint, as a string, e.g. path/to/map#entrypoint
  , neededBy :: List FilePath 
  -- ^ list of filenames of maps which reference this entrypoint
  }

```