59 lines
1.9 KiB
Go
59 lines
1.9 KiB
Go
|
package applications
|
||
|
|
||
|
import (
|
||
|
"cwtch.im/tapir"
|
||
|
)
|
||
|
|
||
|
// ApplicationChain is a meta-app that can be used to build complex applications from other applications
|
||
|
type ApplicationChain struct {
|
||
|
TranscriptApp
|
||
|
apps []tapir.Application
|
||
|
endapp tapir.InteractiveApplication
|
||
|
capabilities []tapir.Capability
|
||
|
}
|
||
|
|
||
|
// ChainApplication adds a new application to the chain. Returns a pointer to app so this call
|
||
|
// can itself be chained.
|
||
|
func (appchain *ApplicationChain) ChainApplication(app tapir.Application, capability tapir.Capability) *ApplicationChain {
|
||
|
appchain.apps = append(appchain.apps, app.NewInstance())
|
||
|
appchain.capabilities = append(appchain.capabilities, capability)
|
||
|
return appchain
|
||
|
}
|
||
|
|
||
|
// ChainInteractiveApplication adds an interactive application to the chain. There can only be 1 interactive application.
|
||
|
func (appchain *ApplicationChain) ChainInteractiveApplication(app tapir.InteractiveApplication) *ApplicationChain {
|
||
|
appchain.endapp = app
|
||
|
return appchain
|
||
|
}
|
||
|
|
||
|
// NewInstance should always return a new instantiation of the application.
|
||
|
func (appchain *ApplicationChain) NewInstance() tapir.Application {
|
||
|
applicationChain := new(ApplicationChain)
|
||
|
for _, app := range appchain.apps {
|
||
|
applicationChain.apps = append(applicationChain.apps, app.NewInstance())
|
||
|
}
|
||
|
applicationChain.capabilities = appchain.capabilities
|
||
|
return applicationChain
|
||
|
}
|
||
|
|
||
|
// Init is run when the connection is first started.
|
||
|
func (appchain *ApplicationChain) Init(connection tapir.Connection) {
|
||
|
appchain.TranscriptApp.Init(connection)
|
||
|
for i, app := range appchain.apps {
|
||
|
app.PropagateTranscript(appchain.transcript)
|
||
|
app.Init(connection)
|
||
|
if connection.HasCapability(appchain.capabilities[i]) == false {
|
||
|
connection.Close()
|
||
|
return
|
||
|
}
|
||
|
connection.SetApp(app)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Listen calls listen on the Interactive application
|
||
|
func (appchain *ApplicationChain) Listen() {
|
||
|
if appchain.endapp != nil {
|
||
|
appchain.endapp.Listen()
|
||
|
}
|
||
|
}
|