#!/usr/bin/env yacl

from yacl_base import *
from yacl_utils import *
import yacl_execute

class BaseMachineConfig(YaclBaseClass, ABC):
  _execute = yacl_execute.json_serializer()

class BaseMachineMixin(BaseMachineConfig, ABC):
  implemented_roles = []

  machine = external_primary()

  def _enable():
    implemented_roles = get('implemented_roles')
    requested_roles = get('role')
    for implemented_role in implemented_roles:
      if implemented_role != requested_roles and implemented_role not in requested_roles:
        return False
    return True

class MyDNSHost(BaseMachineMixin):
  implemented_roles = appending(['dns'])

class MyDHCPHost(BaseMachineMixin):
  implemented_roles = appending(['dhcp'])

class MyMixedHost(MyDNSHost, MyDHCPHost):
  # implemented_roles = appending([])
  pass


# Example of usage.
context_set = [
  {"machine": "omega", "role": ["dns", "dhcp"]},
]

from yacl_eval import go

go(MyMixedHost, context_set)
