#! /bin/env tclsh
package require tdbc::sqlite3
package require ycl::proc
namespace import [yclprefix]::proc::checkargs
namespace import [yclprefix]::proc::dproc
package require ycl::context
namespace import [yclprefix]::context::context
package require ycl::twyst::control
package require ycl::twyst::dispatch
catch {rename dispatch {}}
namespace import [yclprefix]::twyst::dispatch::dispatch
namespace import [yclprefix]::twyst::dispatch::wait
package require ycl::twyst::storage
package require ycl::twyst::ui
namespace eval doc {}
proc state {} {
namespace eval [set newns [namespace current]::[clock clicks]] {}
return $newns
}
variable doc::twyst {
description {
a quickly-coded version of gryp to get started
}
args {
repo {
description {
the path to repository
}
}
}
}
dproc twyst $doc::twyst args {
checkargs doc::twyst args
set twyst [context]
$twyst $ repo $repo
$twyst eval {
namespace path [list [uplevel namespace current] {*}[namespace path]]
set repodir [file normalize [file dirname $repo]]
set repobase [file tail $repo]
if {![file exists $repodir]} {
return -code error "repository directory does not exist: $repodir"
}
storage new store1 $repo
control new ctrl
ui new user
}
foreach method {
welcome
start
incoming
mode
add
add_mode
entity
entity_check
entity_added
} {
$twyst method $method
}
trace add variable ${twyst}::user::answer write [list $twyst incoming]
dispatch $twyst welcome
return
}
proc incoming {state args} {
dispatch $state [$state $ step]
}
proc uimsg args {
}
proc welcome {state} {
dispatch $state eval {user msg "Welcome to Twyst!"}
after 500
dispatch $state start
}
proc start {state} {
$state $ step mode
dispatch $state eval [list user choose [list [ADD] [BROWSE] [SEARCH]]]
}
proc mode {state} {
if {[set mode [$state eval user $ answer]] ni [list [ADD] [BROWSE] [SEARCH]]} {
error "invalid mode: mode"
}
dispatch $state $mode
}
proc add {state} {
$state $ step add_mode
dispatch $state eval [list user choose [list [ENTITY] [FACT]]]
}
proc add_mode {state} {
if {[set mode [$state eval user $ answer]] ni [list [ENTITY] [FACT]]} {
error "invalid answer: $mode. Should be one of [ENTITY], [FACT]"
}
dispatch $state $mode
}
proc entity {state} {
$state $ step entity_check
dispatch $state eval {user enter "enter entity name" }
}
proc entity_check {state} {
set answer [$state eval {user $ answer}]
set current [$state eval [list store1 lookup entity $answer]]
if {$current eq {}} {
set res [$state eval [list store1 add entity $answer]]
dispatch $state entity_added
} else {
$state eval [list user msg "already exists: $answer"]
dispatch $state entity
}
}
proc entity_added {state} {
set answer [$state eval {user $ answer}]
$state eval [list user msg "added: $answer"]
dispatch $state start
}
proc go args {
twyst {*}$args
vwait forever
}
proc ADD {} {return add}
proc ENTITY {} {return entity}
proc FACT {} {return fact}
proc BROWSE {} {return browse}
proc SEARCH {} {return search}