diff options
author | Florian Dold <florian@dold.me> | 2021-11-02 16:20:39 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-11-02 16:20:46 +0100 |
commit | aa78c1105e7b6b74d6185cc33daa42f93ccbea58 (patch) | |
tree | 59a9a41b918c03ae7a272bc48227963b2ebeb5e6 /packages/anastasis-core/src/cli.ts | |
parent | a4cdc02e5017ba587c169cb28a7e7927fc64c7cf (diff) | |
download | wallet-core-aa78c1105e7b6b74d6185cc33daa42f93ccbea58.tar.xz |
anastasis-core: provide reducer CLI, refactor state machine
Diffstat (limited to 'packages/anastasis-core/src/cli.ts')
-rw-r--r-- | packages/anastasis-core/src/cli.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/anastasis-core/src/cli.ts b/packages/anastasis-core/src/cli.ts new file mode 100644 index 000000000..5ab7af6db --- /dev/null +++ b/packages/anastasis-core/src/cli.ts @@ -0,0 +1,64 @@ +import { clk } from "@gnu-taler/taler-util"; +import { + getBackupStartState, + getRecoveryStartState, + reduceAction, +} from "./index.js"; +import fs from "fs"; + +export const reducerCli = clk + .program("reducer", { + help: "Command line interface for the GNU Taler wallet.", + }) + .flag("initBackup", ["-b", "--backup"]) + .flag("initRecovery", ["-r", "--restore"]) + .maybeOption("argumentsJson", ["-a", "--arguments"], clk.STRING) + .maybeArgument("action", clk.STRING) + .maybeArgument("stateFile", clk.STRING); + +async function read(stream: NodeJS.ReadStream): Promise<string> { + const chunks = []; + for await (const chunk of stream) { + chunks.push(chunk); + } + return Buffer.concat(chunks).toString("utf8"); +} + +reducerCli.action(async (x) => { + if (x.reducer.initBackup) { + console.log(JSON.stringify(await getBackupStartState())); + return; + } else if (x.reducer.initRecovery) { + console.log(JSON.stringify(await getRecoveryStartState())); + return; + } + + const action = x.reducer.action; + if (!action) { + console.log("action required"); + return; + } + + let lastState: any; + if (x.reducer.stateFile) { + const s = fs.readFileSync(x.reducer.stateFile, { encoding: "utf-8" }); + lastState = JSON.parse(s); + } else { + const s = await read(process.stdin); + lastState = JSON.parse(s); + } + + let args: any; + if (x.reducer.argumentsJson) { + args = JSON.parse(x.reducer.argumentsJson); + } else { + args = {}; + } + + const nextState = await reduceAction(lastState, action, args); + console.log(JSON.stringify(nextState)); +}); + +export function reducerCliMain() { + reducerCli.run(); +} |