code: def _gc_rule_from_pb(gc_rule_pb):
      
      rule_name = gc_rule_pb.WhichOneof("rule")
      if rule_name is None:
          return None
  
      if rule_name == "max_num_versions":
          return MaxVersionsGCRule(gc_rule_pb.max_num_versions)
      elif rule_name == "max_age":
          max_age = _helpers._duration_pb_to_timedelta(gc_rule_pb.max_age)
          return MaxAgeGCRule(max_age)
      elif rule_name == "union":
          return GCRuleUnion([_gc_rule_from_pb(rule) for rule in gc_rule_pb.union.rules])
      elif rule_name == "intersection":
          rules = [_gc_rule_from_pb(rule) for rule in gc_rule_pb.intersection.rules]
          return GCRuleIntersection(rules)
      else:
          raise ValueError("Unexpected rule name", rule_name)
docs: Convert a protobuf GC rule to a native object.
  
      :type gc_rule_pb: :class:`.table_v2_pb2.GcRule`
      :param gc_rule_pb: The GC rule to convert.
  
      :rtype: :class:`GarbageCollectionRule` or :data:`NoneType <types.NoneType>`
      :returns: An instance of one of the native rules defined
                in :module:`column_family` or :data:`None` if no values were
                set on the protobuf passed in.
      :raises: :class:`ValueError <exceptions.ValueError>` if the rule name
               is unexpected.