A Rust implementation of the External Editor API for Tabletop Simulator.
This is intended to make it easier to write development tools and plugins instead of using the built-in script editor.
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(); } ```
You can send four types of outgoing messages:
```rs use ttsexternalapi::{messages::AnswerReload, ExternalEditorApi};
fn getluascripts(api: ExternalEditorApi) { let answerreload: AnswerReload = api.getscripts().unwrap(); println!("{:#?}", answerreload.scriptstates); } ```
```rs use ttsexternalapi::{json, messages::AnswerReload, ExternalEditorApi};
fn saveandplay(api: ExternalEditorApi) { // Objects not mentioned in the scriptstates are not updated let answerreload: AnswerReload = api.reload(json!([])).unwrap(); println!("{:#?}", answer_reload); } ```
```rs use ttsexternalapi::{json, ExternalEditorApi, Value};
fn custommessage(api: ExternalEditorApi) { let message: Value = json![{"foo": "Foo", "bar": "Bar"}]; api.custommessage(message).unwrap(); } ```
```rs use ttsexternalapi::{messages::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); } ```
You can also listen to eight types of incoming messages:
```rs use ttsexternalapi::{messages::AnswerNewObject, ExternalEditorApi};
fn awaitnewobject(api: ExternalEditorApi) { let answernewobject: AnswerNewObject = api.wait(); println!("{:#?}", answernewobject); } ```
```rs use ttsexternalapi::{messages::AnswerReload, ExternalEditorApi};
fn awaitreload(api: ExternalEditorApi) { let answerreload: AnswerReload = api.wait(); println!("{:#?}", answer_reload); } ```
```rs use ttsexternalapi::{messages::AnswerPrint, ExternalEditorApi};
fn awaitprint(api: ExternalEditorApi) { let answerprint: AnswerPrint = api.wait(); println!("{:#?}", answer_print); } ```
```rs use ttsexternalapi::{messages::AnswerError, ExternalEditorApi};
fn awaiterror(api: ExternalEditorApi) { let answererror: AnswerError = api.wait(); println!("{:#?}", answer_error); } ```
```rs use ttsexternalapi::{messages::AnswerCustomMessage, ExternalEditorApi};
fn awaitcustommessage(api: ExternalEditorApi) { let answercustommessage: AnswerCustomMessage = api.wait(); println!("{:#?}", answercustommessage); } ```
```rs use ttsexternalapi::{messages::AnswerReturn, ExternalEditorApi};
fn awaitreturn(api: ExternalEditorApi) { let answerreturn: AnswerReturn = api.wait(); println!("{:#?}", answer_return); } ```
```rs use ttsexternalapi::{messages::AnswerGameSaved, ExternalEditorApi};
fn awaitgamesaved(api: ExternalEditorApi) { let answergamesaved: AnswerGameSaved = api.wait(); println!("{:#?}", answergamesaved); } ```
```rs use ttsexternalapi::{messages::AnswerObjectCreated, ExternalEditorApi};
fn awaitobjectcreated(api: ExternalEditorApi) { let answerobjectcreated: AnswerObjectCreated = api.wait(); println!("{:#?}", answerobjectcreated); } ```
Or you can wait for any incoming message:
```rs use ttsexternalapi::{messages::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"), } } ```