ycl

Artifact [86f254b382]
Login

Artifact [86f254b382]

Artifact 86f254b3823e3f86b1d4060256a73fbba8e0c8db:


#! /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}