Skip to content

Commit

Permalink
Support optional version and tag
Browse files Browse the repository at this point in the history
Fixes: #11
  • Loading branch information
stuartmscott committed Jan 12, 2023
1 parent 94ca277 commit c8a5446
Show file tree
Hide file tree
Showing 35 changed files with 585 additions and 137 deletions.
37 changes: 23 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,14 @@ A State Machine;
- Writes logs to either stdout or the filesystem for Debuggability.
- Has a Hierarchy of States to minimize Code Duplication.
- Is Uniquely Identified by its Binary Name and Network Address;
- local `:<port>` or `localhost:<port>` or `127.0.0.1:<port>`
- remote `<ip>:<port>`
- binary name consists of;
- package and executable: `family/Parent` or `family/Child`
- optional [semantic versioning](https://semver.org/): `family/Parent_v0.0.1`
- optional tag: `family/Child:Alice` or `family/Child:Bob`
- compound example: `family/Child_v1.2.3:Alice`
- address can either be local, or remote;
- local: `:<port>` or `localhost:<port>` or `127.0.0.1:<port>`
- remote: `<ip>:<port>`

### States

Expand Down Expand Up @@ -58,15 +64,16 @@ The optional empty receiver is triggered if no other receivers match.
int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}
Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "switch/Switch", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);
m.AddState(std::make_unique<State>(
// State Name
Expand Down Expand Up @@ -137,15 +144,16 @@ When a parent is notified that a child has errored, it can chose to do nothing,
int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}
Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "family/Parent", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);
m.AddState(std::make_unique<State>(
// State Name
Expand Down Expand Up @@ -212,15 +220,16 @@ int main(int argc, char **argv) {
int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}
Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "family/Child", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);
m.AddState(std::make_unique<State>(
// State Name
Expand Down
12 changes: 6 additions & 6 deletions include/Wink/machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@

class Machine {
public:
Machine(Address &spawner, Address &address, std::string name, Socket &socket)
: spawner(spawner), address(address), name(name), socket(socket) {}
Machine(std::string name, Socket &socket, Address &address, Address &spawner)
: name(name), socket(socket), address(address), spawner(spawner) {}
Machine(const Machine &m) = delete;
Machine(Machine &&m) = delete;
~Machine() {}
/**
* Returns this Machine's Unique Identifier.
*/
std::string Uid() const { return uid; }
std::string UID() const { return uid; }
/**
* Start begins execution of the state machine and sends a
* 'started' message to the machine which spawned this machine.
Expand Down Expand Up @@ -101,12 +101,12 @@ class Machine {
void registerMachine(const std::string &machine, const int pid);
void unregisterMachine();

Address &spawner;
Address &address;
std::string name;
Socket &socket;
Address &address;
Address &spawner;
std::string uid;
bool running = true;
Socket &socket;
Address sender;
char buffer[MAX_PAYLOAD];
std::map<const std::string, const std::unique_ptr<State>> states;
Expand Down
40 changes: 40 additions & 0 deletions include/Wink/semver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef SEMVER_H
#define SEMVER_H

#include <sstream>
#include <string>

class SemVer {
public:
SemVer() {}
SemVer(std::string version) : _version(version) { stov(version); }
SemVer(int major, int minor, int patch, std::string prerelease,
std::string build)
: _major(major), _minor(minor), _patch(patch), _prerelease(prerelease),
_build(build) {
_version = vtos();
}
~SemVer() {}
std::string version();
int major();
int minor();
int patch();
std::string prerelease();
std::string build();
void stov(const std::string &version);
std::string vtos() const;
bool operator<(const SemVer &rhs) const;

private:
std::string _version = "";
int _major = 0;
int _minor = 0;
int _patch = 0;
std::string _prerelease = "";
std::string _build = "";
};

std::istream &operator>>(std::istream &is, SemVer &v);
std::ostream &operator<<(std::ostream &os, const SemVer &v);

#endif
6 changes: 5 additions & 1 deletion include/Wink/server/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <Wink/constants.h>
#include <Wink/log.h>
#include <Wink/machine.h>
#include <Wink/semver.h>
#include <Wink/socket.h>

class Server {
Expand All @@ -27,7 +28,7 @@ class Server {
Server(Server &&m) = delete;
~Server() {}
int Serve(const std::string &directory);
int Start(const std::string &machine,
int Start(const std::string &binary, const std::string &machine,
const std::vector<std::string> &parameters);
int Stop(int port);

Expand All @@ -41,4 +42,7 @@ class Server {
std::map<ushort, int> pids;
};

std::string resolveVersion(const std::string &directory,
const std::string &machine);

#endif
2 changes: 2 additions & 0 deletions samples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ add_subdirectory("switch")
add_subdirectory("time")

add_subdirectory("useless")

add_subdirectory("version")
4 changes: 4 additions & 0 deletions samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,7 @@ Demonstrates various time-related use cases.
## [Useless](useless/README.md)

A Useless State Machine that exits as soon as it is started.

## [Version](version/README.md)

Demonstrates how multiple versions of the same State Machine can coexist.
9 changes: 5 additions & 4 deletions samples/echo/echo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "echo/Echo", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
// State Name
Expand Down
9 changes: 5 additions & 4 deletions samples/family/child.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "family/Child", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
// State Name
Expand Down
14 changes: 8 additions & 6 deletions samples/family/parent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "family/Parent", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
// State Name
Expand All @@ -26,7 +27,8 @@ int main(int argc, char **argv) {
// On Entry Action
[&]() {
info() << "Parent: OnEntry\n" << std::flush;
m.Spawn("family/Child");
m.Spawn("family/Child:Alice");
m.Spawn("family/Child:Bob");
},
// On Exit Action
[]() { info() << "Parent: OnExit\n"
Expand Down Expand Up @@ -63,7 +65,7 @@ int main(int argc, char **argv) {
args >> child;
info() << "Parent: " << sender << ' ' << child << " has exited\n"
<< std::flush;
m.GotoState("main"); // Retry
m.Spawn(child); // Retry
}},
}));

Expand Down
1 change: 1 addition & 0 deletions samples/fizzbuzz/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ start fizzbuzz/FizzBuzz
send <fizzbuzz> 1
send <fizzbuzz> 2
send <fizzbuzz> 3
...
```
9 changes: 5 additions & 4 deletions samples/fizzbuzz/fizzbuzz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "fizzbuzz/FizzBuzz", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
// State Name
Expand Down
10 changes: 5 additions & 5 deletions samples/forward/forward.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
int main(int argc, char **argv) {
if (argc < 4) {
error()
<< "Incorrect parameters, expected <spawner> <address> <destination>\n"
<< "Incorrect parameters, expected <address> <spawner> <destination>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name("forward/Forward");
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, name, socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

Address destination(argv[3]);

Expand Down
9 changes: 5 additions & 4 deletions samples/hierarchy/bigger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "hierarchy/Bigger", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
// State Name
Expand Down
9 changes: 5 additions & 4 deletions samples/hierarchy/empty.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "hierarchy/Empty", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.Start();
}
9 changes: 5 additions & 4 deletions samples/hierarchy/forrest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@

int main(int argc, char **argv) {
if (argc < 3) {
error() << "Incorrect parameters, expected <spawner> <address>\n"
error() << "Incorrect parameters, expected <address> <spawner>\n"
<< std::flush;
return -1;
}

Address spawner(argv[1]);
Address address(argv[2]);
std::string name(argv[0]);
UDPSocket socket;
Machine m(spawner, address, "hierarchy/Forrest", socket);
Address address(argv[1]);
Address spawner(argv[2]);
Machine m(name, socket, address, spawner);

m.AddState(std::make_unique<State>(
"Leaf1", "", []() {}, []() {},
Expand Down
Loading

0 comments on commit c8a5446

Please sign in to comment.