diff --git a/swarmsim/engine/eventdrivenengine.nim b/swarmsim/engine/eventdrivenengine.nim index 1295f0c..8b5757d 100644 --- a/swarmsim/engine/eventdrivenengine.nim +++ b/swarmsim/engine/eventdrivenengine.nim @@ -4,8 +4,11 @@ import std/strformat import ./types import ./schedulableevent +export options +export EventDrivenEngine + type - AwaitableHandle = object of RootObj + AwaitableHandle* = object of RootObj schedulable: SchedulableEvent engine: EventDrivenEngine @@ -44,7 +47,3 @@ proc run*(self: EventDrivenEngine): void = proc doAwait*(self: AwaitableHandle): void = self.engine.runUntil(self.schedulable.time) - -export EventDrivenEngine -export AwaitableHandle -export options diff --git a/swarmsim/engine/message.nim b/swarmsim/engine/message.nim index 43f52b5..ff67167 100644 --- a/swarmsim/engine/message.nim +++ b/swarmsim/engine/message.nim @@ -2,8 +2,10 @@ import std/options import ./types +export options +export Message + proc new*(T: type Message, sender: Option[Peer] = none(Peer), receiver: Peer, messageType: string): Message = Message(sender: sender, receiver: receiver, messageType: messageType) -export Message -export options + diff --git a/swarmsim/engine/network.nim b/swarmsim/engine/network.nim index d113737..6b70ffe 100644 --- a/swarmsim/engine/network.nim +++ b/swarmsim/engine/network.nim @@ -5,6 +5,12 @@ import ./types import ./peer import ./eventdrivenengine +export options +export sets +export peer +export eventdrivenengine +export Network + type ScheduledMessage = ref object of SchedulableEvent message: Message @@ -42,9 +48,3 @@ proc send*(self: Network, message: Message, method atScheduledTime*(self: ScheduledMessage, engine: EventDrivenEngine) = self.message.receiver.deliver(self.message) - -export Network -export peer -export eventdrivenengine -export options -export sets diff --git a/swarmsim/engine/peer.nim b/swarmsim/engine/peer.nim index 35c2ba6..1df9dc2 100644 --- a/swarmsim/engine/peer.nim +++ b/swarmsim/engine/peer.nim @@ -5,12 +5,10 @@ import std/random import ./types import ./protocol -## TODO a "readonly" pragma could probably be my first macro -proc `peerId=`*(self: Peer, id: int): void {.error: "Cannot assign to `peerId` property of `Peer`.".} - -proc `protocols=`*(self: Peer, value: Table[string, Protocol]): void {.error: "Cannot assign to `protocols` property of `Peer`.".} - -proc `protocols`*(self: Peer): Table[string, Protocol] {.error: "Cannot read from `protocols` property of `Peer`.".} +export options +export tables +export protocol +export Peer proc getProtocol*(self: Peer, protocolId: string): Option[Protocol] = if self.protocols.hasKey(protocolId): @@ -34,13 +32,9 @@ proc hash*(self: Peer): int = self.peerId proc new*( T: type Peer, protocols: seq[Protocol], - peerId: Option[int] = none(int) + peerId: Option[int] = none(int), ): Peer = # XXX I can't have put this in the init proc as that would mean allowing public # write access to every field in Peer. Not sure how to solve this in nim. let peerId = peerId.get(rand(high(int))) initPeer(Peer(protocols: initTable[string, Protocol](), peerId: peerId), protocols) - -export Peer -export options -export tables diff --git a/swarmsim/engine/protocol.nim b/swarmsim/engine/protocol.nim index 825309e..1427cfe 100644 --- a/swarmsim/engine/protocol.nim +++ b/swarmsim/engine/protocol.nim @@ -1,4 +1,8 @@ import ./types +import ./message + +export message +export Protocol method uncheckedDeliver(self: Protocol, message: Message): void {.base.} = raise newException(CatchableError, "Method without implementation override") @@ -6,5 +10,3 @@ method uncheckedDeliver(self: Protocol, message: Message): void {.base.} = proc deliver*(self: Protocol, message: Message): void = assert(self.messageType == message.messageType) self.uncheckedDeliver(message) - -export Protocol diff --git a/swarmsim/engine/schedulableevent.nim b/swarmsim/engine/schedulableevent.nim index 739e659..fea42b9 100644 --- a/swarmsim/engine/schedulableevent.nim +++ b/swarmsim/engine/schedulableevent.nim @@ -1,5 +1,7 @@ import ./types +export SchedulableEvent + func `<`*(self: SchedulableEvent, other: SchedulableEvent): bool = return self.time < other.time @@ -10,5 +12,3 @@ method atScheduledTime*(self: SchedulableEvent, engine: EventDrivenEngine): void ## default, it does nothing. ## discard - -export SchedulableEvent diff --git a/swarmsim/engine/types.nim b/swarmsim/engine/types.nim index 6fc3466..30b2723 100644 --- a/swarmsim/engine/types.nim +++ b/swarmsim/engine/types.nim @@ -3,6 +3,9 @@ import std/tables import std/sets import std/options +export heapqueue +export option + type SchedulableEvent* = ref object of RootObj ## A `SchedulableEvent` is an event that can be scheduled for execution in an `EventDrivenEngine` @@ -44,6 +47,3 @@ type engine*: EventDrivenEngine defaultLinkDelay*: uint64 peers*: HashSet[Peer] # TODO: use an array - -export heapqueue -export option diff --git a/tests/swarmsim/engine/network.nim b/tests/swarmsim/engine/network.nim index e9814e0..6f83989 100644 --- a/tests/swarmsim/engine/network.nim +++ b/tests/swarmsim/engine/network.nim @@ -22,12 +22,12 @@ suite "network": test "should dispatch message to the correct protocol within a peer": let engine = EventDrivenEngine() - var protocols: seq[Protocol] = newSeq[Protocol]() - - protocols.add(FakeProtocol(messageType: "protocol1", received: false)) - protocols.add(FakeProtocol(messageType: "protocol2", received: false)) - - let peer = Peer.new(protocols = protocols) + let peer = Peer.new( + protocols = @[ + Protocol FakeProtocol(messageType: "protocol1", received: false), + FakeProtocol(messageType: "protocol2", received: false) + ] + ) let network = Network.new(engine = engine, defaultLinkDelay = 20) network.add(peer)