code: def __call__(self, decoded_input: str) -> Union[str, None]:
      # Greedy match on first label that matches the input
      for label, label_def in self.match.items():
          label_def_type = label_def["type"]
          label_def_value = label_def["value"]
  
          if label_def_type == "contains":
              is_match = self.contains(decoded_input, label_def_value)
          elif label_def_type == "regex":
              is_match = self.regex(decoded_input, label_def_value)
          else:
              raise ValueError(
                  f"{label_def_type} is not a valid match `type`. Ludwig "
                  "currently supports `contains` and `regex` match types."
              )
  
          if is_match:
              return label
      return None
  
imports: import logging
  import re
  from typing import Any, Dict, List, Union
  import torch
  from ludwig.api_annotations import DeveloperAPI
  from ludwig.constants import CATEGORY, LOGITS, PREDICTIONS, PROBABILITIES, TEXT
  from ludwig.decoders.base import Decoder
  from ludwig.decoders.registry import register_decoder
  from ludwig.decoders.utils import extract_generated_tokens
  from ludwig.schema.decoders.llm_decoders import CategoryExtractorDecoderConfig, TextExtractorDecoderConfig
  from ludwig.utils.strings_utils import get_tokenizer
label_desc: Use image node_id 4 for calling the Matcher obj's underlying member method code with example usage: obj.__call__(decoded_input) and returns: None, label