import os
import socket

class RedisError(Exception):
    pass

class Redis:
    def __init__(self):
        self.sock = socket.create_connection(('127.0.0.1', int(os.environ.get('REDIS_PORT', '16389'))), timeout=3)
        self.f = self.sock.makefile('rb')
    def close(self):
        self.f.close()
        self.sock.close()
    def read(self):
        line = self.f.readline()
        if not line.endswith(b'\r\n'):
            raise EOFError('incomplete RESP line')
        kind, body = line[:1], line[1:-2]
        if kind == b'+': return body.decode()
        if kind == b'-': return RedisError(body.decode())
        if kind == b':': return int(body)
        if kind == b'$':
            n = int(body)
            if n == -1: return None
            data = self.f.read(n)
            if len(data) != n or self.f.read(2) != b'\r\n': raise EOFError('incomplete bulk')
            return data.decode()
        if kind == b'*':
            n = int(body)
            return None if n == -1 else [self.read() for _ in range(n)]
        raise ValueError('unsupported RESP type')
    def call(self, *args):
        vals = [str(a).encode() for a in args]
        wire = b'*%d\r\n' % len(vals)
        wire += b''.join(b'$%d\r\n' % len(v) + v + b'\r\n' for v in vals)
        self.sock.sendall(wire)
        return self.read()
