UNPKG

@nfps.dev/cli

Version:

CLI for NFP development, inspection, and manipulation

107 lines 3.54 kB
import { fold, oderac, oderom } from '@blake.regalia/belt'; import { format_query, query_contract } from '@solar-republic/neutrino'; import { cli_entries, cli_exec_contract, define_command, exit, load, print, result } from '../common.js'; async function storage_get(si_area, g_argv) { const { sh_vk, k_contract, k_wallet, } = await load(g_argv, ['vk']); const si_method = `storage_${si_area}_get`; const h_query = format_query(si_method, { keys: [g_argv.key, ...g_argv.keys || []], }, [sh_vk, k_wallet.addr]); print('Querying contract', { contract: k_contract.addr, message: JSON.stringify(h_query), }); const [xc_code, s_error, h_msg] = await query_contract(k_contract, h_query); print('Query response:'); // dereference data const a_data = h_msg?.[si_method]?.data; // not shaped correctly if (!a_data) return exit(`Invalid contract response:\n${JSON.stringify(h_msg)}`); // turn into object result(JSON.stringify(fold(a_data, (g_entry) => { if (!g_entry.key) { return exit(`Invalid data entry in contract response:\n${JSON.stringify(g_entry)}`); } return { [g_entry.key]: g_entry.value, }; }))); } async function storage_put(si_area, g_argv) { // prep entries const a_entries = []; // create entries for (const sx_entry of [g_argv.entry, ...g_argv.entries || []]) { a_entries.push(...oderac(cli_entries(sx_entry), (si_key, w_value) => ({ key: si_key, value: w_value, }))); } // prep message const g_msg = { [`storage_${si_area}_put`]: { data: a_entries, }, }; // execute await cli_exec_contract(g_argv, g_msg, 50000n); } const H_POS_GET = { key: { type: 'string', }, keys: { type: 'string', array: true, desc: 'which keys to fetch from the object', }, }; const H_POS_PUT = { entry: { type: 'string', desc: 'key-value entries to merge into the data object. accepts JSON or inlined ECMAScript objects. e.g., "foo:\'bar\', baz:25"', }, entries: { type: 'string', array: true, desc: 'same as entry but optionally repeated', }, }; function storage_area(si_area, b_readonly = false) { return define_command({ info: `manage ${si_area} storage`, commands: { 'get <key> [keys...]': define_command({ info: `get some data from ${si_area} storage area`, pos: H_POS_GET, async handler(g_argv) { await storage_get(si_area, g_argv); }, }), ...b_readonly ? {} : { 'put <entry> [entries..]': define_command({ info: `put some data into ${si_area} storage area`, pos: H_POS_PUT, async handler(g_argv) { await storage_put(si_area, g_argv); }, }), }, }, }); } export const H_CMDS_STORAGE = { 'storage <cmd>': define_command({ info: 'manage storage', commands: { // owner storage area 'owner <cmd>': storage_area('owner'), // token storage area 'token <cmd>': storage_area('token', true), // global storage area 'global <cmd>': storage_area('global'), }, }), }; //# sourceMappingURL=storage.js.map