blob: 10affbbac1ae310574b61f36505dbcd2875fa604 [file] [log] [blame] [raw]
package li.cil.oc.api.detail;
import li.cil.oc.api.network.Component;
import li.cil.oc.api.network.ComponentConnector;
import li.cil.oc.api.network.Connector;
import li.cil.oc.api.network.Node;
import li.cil.oc.api.network.Visibility;
/**
* Used for building {@link Node}s via {@link li.cil.oc.api.Network#newNode}.
*
* @param <T> the type of the node created by this builder.
*/
public interface Builder<T extends Node> {
/**
* Finalizes the construction of the node.
* <p/>
* This performs the actual creation of the node, initializes it to the
* settings defined by the current builder and returns it.
*
* @return the final node.
*/
T create();
/**
* Builder for basic nodes. These nodes merely allow network access and
* take on no special role.
*/
public static interface NodeBuilder extends Builder<Node> {
/**
* Makes the node a component.
* <p/>
* Nodes that are components can be accessed from computers, methods
* declared in them marked using the {@link li.cil.oc.api.machine.Callback} annotation can
* be invoked from computers that can see the component.
*
* @param name the name of the component.
* @param visibility the visibility of the component.
* @return a builder for a node that is also a component.
* @see li.cil.oc.api.network.Component
*/
ComponentBuilder withComponent(String name, Visibility visibility);
/**
* Makes the node a component.
* <p/>
* Like {@link #withComponent(String, Visibility)}, but with a default
* visibility set to the <em>reachability</em> of the node.
*
* @param name the name of the component.
* @return a builder for a node that is also a component.
* @see li.cil.oc.api.network.Component
*/
ComponentBuilder withComponent(String name);
/**
* Makes the node a connector.
* <p/>
* A connector node can feed power into the network and extract power
* from the network. This is used both for passive energy drain (such
* as running screens and computers) and for active power consumption
* (such as wireless message sending or robot actions).
*
* @param bufferSize the size of the local energy buffer.
* @return a builder for a node that is also a connector.
* @see li.cil.oc.api.network.Connector
*/
ConnectorBuilder withConnector(double bufferSize);
/**
* Makes the node a connector.
* <p/>
* Like {@link #withConnector(double)}, but with a default buffer size
* of zero.
*
* @return a builder for a node that is also a connector.
* @see li.cil.oc.api.network.Connector
*/
ConnectorBuilder withConnector();
}
/**
* Builder for component nodes. These node can be interacted with from
* computers in the same network, that can <em>see</em> the component.
*/
public static interface ComponentBuilder extends Builder<Component> {
/**
* Makes the node a connector.
* <p/>
* A connector node can feed power into the network and extract power
* from the network. This is used both for passive energy drain (such
* as running screens and computers) and for active power consumption
* (such as wireless message sending or robot actions).
*
* @param bufferSize the size of the local energy buffer.
* @return a builder for a node that is also a connector.
* @see li.cil.oc.api.network.Connector
*/
ComponentConnectorBuilder withConnector(double bufferSize);
/**
* Makes the node a connector.
* <p/>
* Like {@link #withConnector(double)}, but with a default buffer size
* of zero.
*
* @return a builder for a node that is also a connector.
* @see li.cil.oc.api.network.Connector
*/
ComponentConnectorBuilder withConnector();
}
/**
* Builder for connector nodes. These nodes can interact with the energy
* stored in the network, i.e. increase or reduce it.
*/
public static interface ConnectorBuilder extends Builder<Connector> {
/**
* Makes the node a component.
* <p/>
* Nodes that are components can be accessed from computers, methods
* declared in them marked using the {@link li.cil.oc.api.machine.Callback} annotation can
* be invoked from computers that can see the component.
*
* @param name the name of the component.
* @param visibility the visibility of the component.
* @return a builder for a node that is also a component.
* @see li.cil.oc.api.network.Component
*/
ComponentConnectorBuilder withComponent(String name, Visibility visibility);
/**
* Makes the node a component.
* <p/>
* Like {@link #withComponent(String, Visibility)}, but with a default
* visibility set to the <em>reachability</em> of the node.
*
* @param name the name of the component.
* @return a builder for a node that is also a component.
* @see li.cil.oc.api.network.Component
*/
ComponentConnectorBuilder withComponent(String name);
}
/**
* Builder for nodes that are both component <em>and</em> connector node.
*/
public static interface ComponentConnectorBuilder extends Builder<ComponentConnector> {
}
}