Implement a command-line interface to the running webserver, and a way to get/set...
[ndcode_site.git] / _config / set.mjs
1 #!/usr/bin/env node
2
3 import stream_buffers from 'stream-buffers'
4 import Problem from './Problem.mjs'
5 import Session from './Session.mjs'
6
7 if (process.argv.length < 3) {
8   console.log(
9     `usage: ${process.argv[0]} ${process.argv[1]} endpoint [args]`
10   )
11   process.exit(1)
12 }
13 let endpoint = process.argv[2]
14 let args = []
15 for (let i = 3; i < process.argv.length; ++i)
16   args.push(JSON.parse(process.argv[i]))
17
18 let write_stream = new stream_buffers.WritableStreamBuffer()
19 let data = new Promise(
20   (resolve, reject) => {
21     write_stream.
22     on('finish', () => {resolve(write_stream.getContents())}).
23     on('error', () => {reject()})
24   }
25 )
26 process.stdin.pipe(write_stream)
27 args.push(JSON.parse((await data).toString('utf-8')))
28
29 let session = new Session('session.json')
30 await session.load()
31
32 try {
33   await session.api_call(endpoint, ...args)
34 }
35 catch (error) {
36   let problem = Problem.from(error)
37   console.error('problem:')
38   console.error('  title:', problem.title)
39   console.error('  detail:', problem.detail)
40   console.error('  status:', problem.status)
41
42   await session.save()
43   process.exit(1)
44 }
45
46 await session.save()