There are two recommended workflows :
- the first one:
- design your whole actions tree model and build it
- create and assign encoders and handlers
- The second is more complient with the YAGNI [*] idiom philosophy :
You only populate your model and create encoders/handlers when a need arise in the source code redaction.
Of course, these are just recommandations, not commandements.
The recommended setup is to create a module which only purpose is to build the action tree, importing it in both client and server scripts and assigning there encoders and handlers
here is an example for a pseudo chat program :
[tree.py] :
from netbytes import p_build
model = '''
client_message (msg:str)
server_message (sender:str, msg:str)'''
tree = p_build(model)
[client.py] :
from netbytes import data_decode
from tree import tree
# let's assume that 'conn' is a connection made with the server
@tree.client_message.ENCODER
def msg_encoder(msg):
return msg
@tree.server_message.HANDLER
def msg_server_handler(data):
sender, msg = data_decode(data)
widget_text.append('{} >>> {}\n'.format(sender, msg))
def on_return_pressed(event):
msg = widget_entry.get()
conn.send(tree.client_message(msg))
# assume we are inside a thread
while 1:
data = conn.recieve()
tree._handle(data)
[server.py] :
from netbytes import data_encode
from tree import tree
# let's assume that 'conn' is a connection made with the client, and that 'conn.name' returns the name of the client
# let's also assume that 'conns' is a list of all client connections
@tree.server_message.ENCODER
def msg_encoder(sender, msg):
return data_encode([server,msg])
@tree.client_message.HANDLER
def msg_client_handler(data):
msg = data
for conn in conns:
conn.send(tree.server_message(conn.name, msg))
# assume we are inside a thread
while 1:
data = conn.recieve()
tree._handle(data)
[*] | : You Ain’t Gonna Need It |