Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79a1201e02 |
@@ -1,100 +1,14 @@
|
||||
import { Command } from "https://deno.land/x/cliffy@v0.25.7/command/mod.ts";
|
||||
import { DB } from "https://deno.land/x/sqlite/mod.ts";
|
||||
import {join} from "https://deno.land/std@0.178.0/path/mod.ts";
|
||||
|
||||
// for the demo, we will place the state in the /tmp instead of $HOME
|
||||
const HOME_DIRECTORY = '/tmp';
|
||||
const CLI_STATE_DIRECTORY = join(HOME_DIRECTORY, 'deno-cli-example');
|
||||
|
||||
// the CLI will need read and write access to /tmp/deno-cli-example directory
|
||||
await Deno.mkdir(CLI_STATE_DIRECTORY, {recursive: true});
|
||||
const MAIN_DB_FILE = join(CLI_STATE_DIRECTORY, 'state.sqlite');
|
||||
|
||||
|
||||
/**
|
||||
* Create tables in the database. This function is a
|
||||
* trivial data migration algorithm.
|
||||
*/
|
||||
function initDB(){
|
||||
const db = new DB(MAIN_DB_FILE);
|
||||
const init_db = `
|
||||
CREATE TABLE IF NOT EXISTS usernames (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT,
|
||||
creation_ts DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`;
|
||||
try {
|
||||
db.execute(init_db);
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
async function helloWorld(options, ...args) {
|
||||
await Deno.writeTextFile("/dev/null", "hello world.", {append: true});
|
||||
console.log('"hello world" has been written into /dev/null');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the latest username saved in the state.
|
||||
*/
|
||||
function getUsernameFromDB(){
|
||||
const db = new DB(MAIN_DB_FILE);
|
||||
try {
|
||||
return db.query(`SELECT username
|
||||
FROM usernames
|
||||
ORDER BY creation_ts
|
||||
DESC LIMIT 1`)[0]
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the passed username in the database.
|
||||
*/
|
||||
function setUsernameInDB(username: string){
|
||||
const db = new DB(MAIN_DB_FILE);
|
||||
try {
|
||||
return db.query("INSERT INTO usernames (username) VALUES (?)", [username])
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
|
||||
function getUsernameOrDefault(name?: string): string{
|
||||
return name || getUsernameFromDB() || 'no username set yet.';
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls httpbin.org/get with the username as argument.
|
||||
*/
|
||||
async function getFromService(options){
|
||||
const username = getUsernameOrDefault(options.usermame);
|
||||
const encodedUsername = encodeURIComponent(username);
|
||||
const url = `https://httpbin.org/get?username=${encodedUsername}`;
|
||||
const response = await fetch();
|
||||
console.log(await response.json());
|
||||
}
|
||||
|
||||
async function setProperties(options){
|
||||
if(options.username){
|
||||
setUsernameInDB(options.username);
|
||||
}
|
||||
}
|
||||
|
||||
initDB();
|
||||
await new Command()
|
||||
.name("deno-cli-example")
|
||||
.version("0.1.0")
|
||||
.description("Example of a deno CLI.")
|
||||
.command('call-service')
|
||||
.description('Example of a real use case. call-service will called '
|
||||
+ 'https://httpbin.org/get with username passed as parameter.')
|
||||
.option("--username <username>",
|
||||
'username to use in the service call. If no username specified, the '
|
||||
+ ' persisted username will be used.')
|
||||
.action(getFromService)
|
||||
.command('set-properties')
|
||||
.description('Persist properties to state. Persisted properties will then '
|
||||
+ 'be used as default in other commands')
|
||||
.option("--username <username>", "Set the default username property.",
|
||||
{required: true})
|
||||
.action(setProperties)
|
||||
.action(helloWorld)
|
||||
.parse(Deno.args);
|
||||
Reference in new issue
Block a user