tts-external-api

A Rust implementation of the External Editor API for Tabletop Simulator.

This is intended to make it easier to write development tools and plugins intead of using the built-in script editor.

ExternalEditorApi

This is the client/server representing the editor. You can listen for connections from an active instance of Tabletop Simulator, and send messages to an active instance.

```rs use ttsexternalapi::ExternalEditorApi;

fn main() { let api = ExternalEditorApi::new(); api.execute(String::from("print('Hello World')")).unwrap(); } ```

Outgoing Messages

You can send four types of outgoing messages:

Get Lua Scripts

```rs use ttsexternalapi::{ExternalEditorApi, AnswerReload};

fn getluascripts(api: ExternalEditorApi) { let answerreload: AnswerReload = api.getscripts().unwrap(); println!("{:#?}", answerreload.scriptstates); } ```

Save & Play

```rs use ttsexternalapi::{json, ExternalEditorApi, AnswerReload};

fn saveandplay(api: ExternalEditorApi) { // Objects not mentioned in the scriptstates are not updated let answerreload: AnswerReload = api.reload(json!([])).unwrap(); println!("{:#?}", answer_reload); } ```

Custom Message

```rs use ttsexternalapi::{json, ExternalEditorApi, Value};

fn custommessage(api: ExternalEditorApi) { let message: Value = json![{"foo": "Foo", "bar": "Bar"}]; api.custommessage(message).unwrap(); } ```

Execute Lua Script

```rs use ttsexternalapi::{AnswerReturn, ExternalEditorApi};

fn executeluascript(api: ExternalEditorApi) { // JSON strings will be deserialized if possible let answerreturn: AnswerReturn = api .execute(String::from( "return JSON.encode({foo = 'Foo', bar = 'Bar'})", )) .unwrap(); println!("{:#?}", answerreturn.return_value); } ```

Incoming Messages

You can also listen to eight types of incoming messages:

Pushing New Object

```rs use ttsexternalapi::{AnswerNewObject, ExternalEditorApi};

fn awaitnewobject(api: ExternalEditorApi) { let answernewobject: AnswerNewObject = api.wait(); println!("{:#?}", answernewobject); } ```

Loading a New Game

```rs use ttsexternalapi::{AnswerReload, ExternalEditorApi};

fn awaitreload(api: ExternalEditorApi) { let answerreload: AnswerReload = api.wait(); println!("{:#?}", answer_reload); } ```

Print/Debug Messages

```rs use ttsexternalapi::{AnswerPrint, ExternalEditorApi};

fn awaitprint(api: ExternalEditorApi) { let answerprint: AnswerPrint = api.wait(); println!("{:#?}", answer_print); } ```

Error Messages

```rs use ttsexternalapi::{AnswerError, ExternalEditorApi};

fn awaiterror(api: ExternalEditorApi) { let answererror: AnswerError = api.wait(); println!("{:#?}", answer_error); } ```

Custom messages

```rs use ttsexternalapi::{AnswerCustomMessage, ExternalEditorApi};

fn awaitcustommessage(api: ExternalEditorApi) { let answercustommessage: AnswerCustomMessage = api.wait(); println!("{:#?}", answercustommessage); } ```

Return messages

```rs use ttsexternalapi::{AnswerReturn, ExternalEditorApi};

fn awaitreturn(api: ExternalEditorApi) { let answerreturn: AnswerReturn = api.wait(); println!("{:#?}", answer_return); } ```

Game Saved

```rs use ttsexternalapi::{AnswerGameSaved, ExternalEditorApi};

fn awaitgamesaved(api: ExternalEditorApi) { let answergamesaved: AnswerGameSaved = api.wait(); println!("{:#?}", answergamesaved); } ```

Object Created

```rs use ttsexternalapi::{AnswerObjectCreated, ExternalEditorApi};

fn awaitobjectcreated(api: ExternalEditorApi) { let answerobjectcreated: AnswerObjectCreated = api.wait(); println!("{:#?}", answerobjectcreated); } ```

Unspecified Message

Or you can wait for any incoming message:

```rs use ttsexternalapi::{Answer, ExternalEditorApi};

fn awaitmessage(api: ExternalEditorApi) { let answer: Answer = api.read(); match answer { Answer::AnswerNewObject() => println!("pushing new object"), Answer::AnswerReload() => println!("loading new game"), Answer::AnswerPrint() => println!("print/debug message"), Answer::AnswerError() => println!("error message"), Answer::AnswerCustomMessage() => println!("custom message"), Answer::AnswerReturn() => println!("return message"), Answer::AnswerGameSaved() => println!("game saved"), Answer::AnswerObjectCreated(_) => println!("object created"), } } ```