import argparse

class Toggle(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        super(Toggle, self).__init__(option_strings, dest, **kwargs)
    def __call__(self, parser, ns, values, option):
        val=True
        if option[0] == '+' or option[0:5] == '--no-':
            val=False
        setattr(ns, self.dest, val)


class Rho(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        super(Rho, self).__init__(option_strings, dest, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        dct=getattr(namespace, self.dest, None)
        if dct is None:
            dct=dict()
        splt=values.rsplit(":", 1)
        rho=float(splt.pop())
        if len(splt) is 0:
            key=None
        else:
            key=splt[0]
        dct[key]=rho
        setattr(namespace, self.dest, dct)

class Keyword(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        super(Keyword, self).__init__(option_strings, dest, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        dct=getattr(namespace, self.dest, None)
        if dct is None:
            dct=dict()
        if values == "":
            dct=dict()
        else:
            key, val=values.split(":", 1)
            dct[key]=val
        setattr(namespace, self.dest, dct)

class Object(argparse.Action):
    def __init__(self, option_strings, dest, **kwargs):
        super(Object, self).__init__(option_strings, dest, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        dct=getattr(namespace, self.dest, None)
        if dct is None:
            dct=set()
        dct.add(values)
        setattr(namespace, self.dest, dct)
