mirror of https://github.com/sbt/sbt.git
Initial API.
parent
3280a667d5
commit
a7483e4a24
|
|
@ -0,0 +1,131 @@
|
||||||
|
This document outlines the high-level Server API exposed by sbt 1.0. Beneath this API is one of simple `Request`/`Response`/`Event` messages. While that API will expounded upon, this API represents the "core" of what the other API should expose, and the "best mechanism" of how to consume it.
|
||||||
|
|
||||||
|
|
||||||
|
# Connecting to sbt
|
||||||
|
|
||||||
|
```scala
|
||||||
|
package sbt.client
|
||||||
|
/**
|
||||||
|
* This represents something that will connect to the sbt server *and* reconnect on failure.
|
||||||
|
*
|
||||||
|
* You can close the connection and stop reconnecting by calling `close()`.
|
||||||
|
*/
|
||||||
|
trait SbtConnector extends Closeable {
|
||||||
|
/**
|
||||||
|
* Register a callback to be notified on initial connection and subsequent reconnects to
|
||||||
|
* an sbt server. If the server is already connected, the handler will be called immediately.
|
||||||
|
*
|
||||||
|
* @param handler A callback that will be called upon every connection/reconnect.
|
||||||
|
* @param ex The context (thread) where the handler should be executed.
|
||||||
|
*/
|
||||||
|
def onConnect(handler: SbtClient => Unit)(implicit ex: ExecutionContext): Subscription
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Interacting with the Server
|
||||||
|
|
||||||
|
```scala
|
||||||
|
package sbt.client
|
||||||
|
/** This represents a connection to the Sbt server, and all the actions that can be performed against an active sbt build. */
|
||||||
|
trait SbtClient extends Closeable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is our mechanism of watching the build structure to see when it changes,
|
||||||
|
* and update our information about the build.
|
||||||
|
*
|
||||||
|
* @param listener - A listener that is notified on build structure changes.
|
||||||
|
* @param ex - The context in which we should execute the listener.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A subscription which can be used to unsubscribe to notifications.
|
||||||
|
*
|
||||||
|
* Note: This will load the entire build structure and pass it too us.
|
||||||
|
*/
|
||||||
|
def watchBuild(listener: BuildStructureListener)(implicit ex: ExecutionContext): Subscription
|
||||||
|
|
||||||
|
// TODO - A mechanism to dynamically load key-dependencies, which are too expensive to compute up front.
|
||||||
|
// Possibly via watching a project and pulling configuration off of it.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives us the autocompletions possible for a given command string.
|
||||||
|
*
|
||||||
|
* @param partialCommand An incomplete command or task string
|
||||||
|
*
|
||||||
|
* @return A set of "more complete" strings that could be used as sbt commands.
|
||||||
|
*
|
||||||
|
* TODO - This should probably return some more structured "completion" thing.
|
||||||
|
* That would allow us to return examples or <tag> types that a client would not use
|
||||||
|
* in autocomplete...
|
||||||
|
*/
|
||||||
|
def possibleAutocompletions(partialCommand: String): Future[Set[String]]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This tries to find whether there is a build key associated with the
|
||||||
|
* current string.
|
||||||
|
*
|
||||||
|
* TODO - default/current project?
|
||||||
|
* TODO - How to handle delegate keys?
|
||||||
|
* TODO - Does this make sense to expose?
|
||||||
|
*/
|
||||||
|
def lookupScopedKey(name: String): Future[Option[ScopedKey]]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the command/task associated with the given input string.
|
||||||
|
*
|
||||||
|
* @param commandOrTask The full command/task string to run.
|
||||||
|
* that should be evaluated.
|
||||||
|
* @return A future that will return Unit if the command request was successfully sent.
|
||||||
|
*/
|
||||||
|
def requestExecution(commandOrTask: String): Future[Unit]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a listener to general events which are fired from this sbt server. These can be things like
|
||||||
|
* "TaskStarted, TaskCanceled, or even custom events from plugins (via GenericEvent).
|
||||||
|
*
|
||||||
|
* @param listener A function that is called when events are fired from sbt.
|
||||||
|
* @param ex The execution context on which to call the listener.
|
||||||
|
*/
|
||||||
|
def handleEvents(listener: EventListener)(implicit ex: ExecutionContext): Subscription
|
||||||
|
/**
|
||||||
|
* Adds a listener to a particular setting. If this setting changes, the event listener
|
||||||
|
* will be notified with the new value (and sent the initial value).
|
||||||
|
*
|
||||||
|
* @param key The setting to listen to changes on.
|
||||||
|
* @param listener A function that is called when the setting value changes.
|
||||||
|
* @param ex The execution context on which to call the listener.
|
||||||
|
*/
|
||||||
|
def watch[T](key: SettingKey[T])(listener: ValueListener[T])(implicit ex: ExecutionContext): Subscription
|
||||||
|
/**
|
||||||
|
* Adds a listener for the value of a particular task. If the evaluated task result changes, the event
|
||||||
|
* listener will be notified of the new value.
|
||||||
|
*
|
||||||
|
* Since tasks read their state from the filesystem, it is not guaranteed that an event will be fired upon change *unless* some
|
||||||
|
* task in the dependency of the specified one is run, requiring the value of the current task to be re-evaluated.
|
||||||
|
*
|
||||||
|
* @param key The task to listen to changes for.
|
||||||
|
* @param listener A function that is called when the setting value changes.
|
||||||
|
* @param ex The execution context on which to call the listener.
|
||||||
|
*/
|
||||||
|
def watch[T](key: TaskKey[T])(l: ValueListener[T])(implicit ex: ExecutionContext): Subscription
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Various helper classes
|
||||||
|
|
||||||
|
Subscription
|
||||||
|
```scala
|
||||||
|
package sbt.client
|
||||||
|
trait Subscription {
|
||||||
|
def cancel(): Unit
|
||||||
|
}
|
||||||
|
```
|
||||||
|
various aliases:
|
||||||
|
```scala
|
||||||
|
package sbt
|
||||||
|
package object client {
|
||||||
|
type BuildStructureListener = MinimalBuildStructure => Unit
|
||||||
|
type ValueListener[T] = (ScopedKey, TaskResult[T]) => Unit
|
||||||
|
type EventListener = Event => Unit
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Loading…
Reference in New Issue