summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Readme.md107
-rw-r--r--src/Main.hs5
2 files changed, 111 insertions, 1 deletions
diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..1f4b17d
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1,107 @@
+# 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`, `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, it
+ will fail.
+ - `--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. If the
+`--json` option is given, it will instead give a json that should conform to
+the following schema:
+
+```purescript
+-- | 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.
+data Level = Info | Suggestion | Warning | 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
+ }
+
+```
diff --git a/src/Main.hs b/src/Main.hs
index 5b8b66f..be28f07 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -37,8 +37,11 @@ data Options = Options
, pretty :: Bool
-- ^ pretty-print the json to make it human-readable
, out :: Maybe String
- , config :: Maybe (LintConfig Maybe)
+ -- ^ path to write the (possibly adjusted) maps to after linting
, configFile :: Maybe FilePath
+ -- ^ path to a config file. Currently required.
+ , config :: Maybe (LintConfig Maybe)
+ -- ^ a "patch" for the configuration file
} deriving (Show, Generic, HasArguments)