104 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			104 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | --- | ||
|  | title: "Scripting" | ||
|  | --- | ||
|  | # Scripting
 | ||
|  | 
 | ||
|  | Scripts can be used to automate certain tasks with Dynamo-Browse. They can also be used to define | ||
|  | new commands or key bindings. | ||
|  | 
 | ||
|  | ## Scripting Basics
 | ||
|  | 
 | ||
|  | Dynamo-Browse scripts are written using the [Tamarin](https://cloudcmds.github.io/tamarin/) scripting language, | ||
|  | which looks a lot like [Go](https://go.dev).  All features of the language are available in Dynamo-Browse. | ||
|  | 
 | ||
|  | The typical "hello world" script for Dynamo-Browse is below: | ||
|  | 
 | ||
|  | ``` | ||
|  | ui.print("Hello, world") | ||
|  | ``` | ||
|  | 
 | ||
|  | This uses the [ui](/docs/reference/script-api/#module-ui) package, which is the package used to interact with | ||
|  | the Dynamo-Browse user interface. | ||
|  | A full list of supported packages can be found in the [Script API](/docs/reference/script-api/) reference, along | ||
|  | with the builtins and packages supported by Tamarin itself. | ||
|  | 
 | ||
|  | {{<hint info>}} | ||
|  |   **Note:** the [ext](/docs/reference/script-api/#module-ext) package is only available to Extension Scripts. | ||
|  | {{</hint>}} | ||
|  | 
 | ||
|  | To execute this script, use the `run-script` command: | ||
|  | 
 | ||
|  | ``` | ||
|  | run-script /path/to/script/hello.tm | ||
|  | ``` | ||
|  | 
 | ||
|  | You'll see that the message "Hello, world" will appear in the status bar of Dynamo-Browse. | ||
|  | 
 | ||
|  | <!-- TODO: Screenshot --> | ||
|  | 
 | ||
|  | Any `print` or `printf` messages will be written to the debug log with the prefix `script <filename>`.  The | ||
|  | debug log is turned off by default, but it can be enabled using the [-debug](/docs/reference/launch-flags/#-debug) flag on launch. | ||
|  | 
 | ||
|  | Scripts loaded using the `run-script` command are for ad-hoc automation tasks that are not necessarily designed for | ||
|  | repeated use. These ad-hoc scripts are executed, then immediately unloaded, and are not generally allowed to extend | ||
|  | Dynamo-Browse.  In order to do so, you will need to write an Extension Script. | ||
|  | 
 | ||
|  | ## Extension Scripts
 | ||
|  | 
 | ||
|  | Extension scripts are scripts designed to extend Dynamo-Browse in some way, such as with new commands or key bindings. | ||
|  | They are traditionally loaded on startup and exist in the predefined "script" directory. They are usually designed for | ||
|  | repeated operations, including those that can be bound to command name or keys. | ||
|  | 
 | ||
|  | The following is an example script which will define a "goto" command.  When invoked, the script will prompt the | ||
|  | user for the value of the partition key.  It will then perform a query over the currently viewed table for any rows with | ||
|  | that partition key.  If no error occurred, the results of the query will be shown to the user. | ||
|  | 
 | ||
|  | ``` | ||
|  | // Define a new "goto" command, which can be invoked when the user presses ':' and types in 'goto' | ||
|  | ext.command("goto", func() { | ||
|  |     // Use the information of the current table to get the name of the partition key. | ||
|  |     pkName := session.current_table().keys["partition"] | ||
|  | 
 | ||
|  |     // Prompt the user for the value to go to.  The user can press Esc, which will cancel | ||
|  |     // the input and return 'nil'. | ||
|  |     keyVal := ui.prompt(pkName + "? ") | ||
|  |     if keyVal == nil { | ||
|  |         return nil | ||
|  |     } | ||
|  | 
 | ||
|  |     // Run a query over the DynamoDB table for any rows with the partition key.  Notice | ||
|  |     // the use of the 'args' option, and the presence of both the name prefix (':key') | ||
|  |     // and value prefix ('$val'). | ||
|  |     res := session.query(":key = $val", { | ||
|  |         args: { | ||
|  |             key: pkName, | ||
|  |             val: keyVal, | ||
|  |         }, | ||
|  |     }) | ||
|  |      | ||
|  |     // The query method will return either an error or a result.  If it's an error, print | ||
|  |     // a notice and exist. | ||
|  |     if res.is_err() { | ||
|  |         ui.print("Can't goto: " + res.err_msg()) | ||
|  |         return nil | ||
|  |     } | ||
|  | 
 | ||
|  |     // If no error, unwrap the result object to get the result-set returned from the query. | ||
|  |     // Then change the current result-set to this one.  This will change the result-set the | ||
|  |     // user is currently seeing. | ||
|  |     session.set_result_set(res.unwrap()) | ||
|  | }) | ||
|  | ``` | ||
|  | 
 | ||
|  | To load an extension script, use the `load-script` command: | ||
|  | 
 | ||
|  | ``` | ||
|  | load-script script.tm | ||
|  | ``` | ||
|  | 
 | ||
|  | The script must exist in the "script" directory, which by default is: | ||
|  | 
 | ||
|  | ``` | ||
|  | $HOME/.config/audax/dynamo-browse/scripts | ||
|  | ``` |