efficient vim config
[dotfiles/.git] / .local / lib / python2.7 / site-packages / pynvim / msgpack_rpc / msgpack_stream.py
1 """Msgpack handling in the event loop pipeline."""
2 import logging
3
4 from msgpack import Packer, Unpacker
5
6 from pynvim.compat import unicode_errors_default
7
8 logger = logging.getLogger(__name__)
9 debug, info, warn = (logger.debug, logger.info, logger.warning,)
10
11
12 class MsgpackStream(object):
13
14     """Two-way msgpack stream that wraps a event loop byte stream.
15
16     This wraps the event loop interface for reading/writing bytes and
17     exposes an interface for reading/writing msgpack documents.
18     """
19
20     def __init__(self, event_loop):
21         """Wrap `event_loop` on a msgpack-aware interface."""
22         self.loop = event_loop
23         self._packer = Packer(unicode_errors=unicode_errors_default)
24         self._unpacker = Unpacker(unicode_errors=unicode_errors_default)
25         self._message_cb = None
26
27     def threadsafe_call(self, fn):
28         """Wrapper around `BaseEventLoop.threadsafe_call`."""
29         self.loop.threadsafe_call(fn)
30
31     def send(self, msg):
32         """Queue `msg` for sending to Nvim."""
33         pass # replaces next logging statement
34         #debug('sent %s', msg)
35         self.loop.send(self._packer.pack(msg))
36
37     def run(self, message_cb):
38         """Run the event loop to receive messages from Nvim.
39
40         While the event loop is running, `message_cb` will be called whenever
41         a message has been successfully parsed from the input stream.
42         """
43         self._message_cb = message_cb
44         self.loop.run(self._on_data)
45         self._message_cb = None
46
47     def stop(self):
48         """Stop the event loop."""
49         self.loop.stop()
50
51     def close(self):
52         """Close the event loop."""
53         self.loop.close()
54
55     def _on_data(self, data):
56         self._unpacker.feed(data)
57         while True:
58             try:
59                 pass # replaces next logging statement
60                 #debug('waiting for message...')
61                 msg = next(self._unpacker)
62                 pass # replaces next logging statement
63                 #debug('received message: %s', msg)
64                 self._message_cb(msg)
65             except StopIteration:
66                 pass # replaces next logging statement
67                 #debug('unpacker needs more data...')
68                 break