```python
def mask_from_prefix(prefix: int) -> str:
    if not isinstance(prefix, int) or prefix < 0 or prefix > 32:
        raise ValueError("Prefix must be an integer from 0 to 32")
    
    return ".".join(str((1 << (32 - i)) - 1) if i <= prefix else "0" for i in range(4))

def prefix_from_mask(mask: str) -> int:
    if not isinstance(mask, str):
        raise ValueError("Mask must be a string")

    octets = mask.split(".")
    if len(octets) != 4:
        raise ValueError("Mask must have exactly four dot-separated fields")

    result = 0
    for octet in octets:
        if not octet.isdigit() or (octet[0] == '0' and len(octet) > 1):
            raise ValueError("Each field must be a decimal number without leading zeros")
        
        value = int(octet)
        if value < 0 or value > 255:
            raise ValueError("Each field must be a decimal number from 0 to 255")

        if result == 0 and value != 255:
            raise ValueError("Mask must have an unbroken run of one bits from the top")
        
        if result != 0 and value != 0:
            raise ValueError("Mask must have an unbroken run of one bits from the top followed only by zeros")

        if value == 255:
            result += 8
        elif value == 192:
            result += 4
        elif value == 128:
            result += 2
        elif value == 64:
            result += 1

    return result
```