diff --git a/app/db.go b/app/db.go index bb925c3..2f82d40 100644 --- a/app/db.go +++ b/app/db.go @@ -62,6 +62,10 @@ type DbTag struct { Keys []string `json:"key"` } +func (entry *DbEntry) Taglist() string { + return strings.Join(entry.Tags, ",") +} + const BucketData string = "data" func GetDbFile(file string) string { diff --git a/contrib/anydbui b/contrib/anydbui new file mode 100755 index 0000000..d635260 --- /dev/null +++ b/contrib/anydbui @@ -0,0 +1,95 @@ +#!/bin/sh + +template="{{.Key}} {{.Created.AsTime.Year}}-{{.Created.AsTime.Month}}-{{.Created.AsTime.Day}} {{.Taglist}} {{.Preview}}" +header="TITLE DATE TAGS PREVIEW" + +# its possible to use another version of anydb for testing purposes +anydb="${ANYDB:-anydb}" + +# list command +command="( echo '$header'; $anydb ls -m template --template '$template' ) | column -t -l4" + +for binary in fzf $anydb column diff awk less; do + if ! type $binary > /dev/null 2>&1; then + echo "$binary is not installed!" + exit 1 + fi +done + +if type gum > /dev/null 2>&1; then + GUM=1 +fi + +_rand() { + awk 'BEGIN {srand(); printf( "%d\n", 1024 * rand() )}' +} + +_list() { + ( + echo "$header" + $anydb ls -m template --template "$template" + ) | column -t -l4 +} + +_updater() { + _port="$1" + _cache="/tmp/anydbcache.$port" + _current="/tmp/anydbcache.$port.current" + + touch $_current $_cache + + while :; do + sleep 10 + + _list > $_current + + if ! diff -q $_current $_cache > /dev/null 2>&1; then + curl -d "reload($command)+clear-screen" "http://127.0.0.1:$_port" + fi + cp $_current $_cache + done +} + +_cleanup() { + # get rid of the update child + kill $pid + + # clean up reloader cache + rm -f /tmp/anydbcache.${port}* +} + + + +# fork background updater +port=$((8000 + $(_rand) % 1000)) +_updater $port & +pid=$! + +db=$($anydb info | grep Database | cut -d: -f2) +shorthelp="$db - [enter]read [c-e]edit [c-k]kill [c-c]exit [c-k]delete" + +if test -n "$GUM"; then + color="Color \"#ff\" \"#0000ff\"" # white on blue + db="{{ $color \"Database:\"}}$db" + enter="{{ $color \"[Enter]\"}} Read" + edit="{{ $color \"[ctrl-c]\"}} Edit" + delete="{{ $color \"[ctrl-k]\"}} Delete" + template="$db $enter $edit $delete" + shorthelp=$(echo "$template" | gum format -t template) +fi + +trap '_cleanup; (exit $?); exit' INT TERM EXIT + +: | command="$command" fzf \ + --bind "start:reload:$command" \ + --header-lines 1 --layout=reverse --info=inline \ + --height 100% --pointer="→" --separator="─" \ + --scrollbar="│" --preview-window "right:50%" \ + --border-label="$shorthelp" \ + --border=bottom --layout=reverse --info=inline \ + --height 100% --header-first --cycle --header-lines=1 --listen=$port \ + --bind "enter:execute: clear; $anydb get {1} | less" \ + --bind "ctrl-e:execute: $anydb edit {1}" \ + --bind "ctrl-k:execute:$anydb del {1}" + +