code: def pack_artifact_properties(artifact_instance: artifact.Artifact):
      """Packs artifact properties and custom properties into a Struct proto."""
      struct_proto = struct_pb2.Struct()
      metadata = {}
      for k, v in itertools.chain(
          artifact_instance.mlmd_artifact.properties.items(),
          artifact_instance.mlmd_artifact.custom_properties.items(),
      ):
          metadata[k] = getattr(v, v.WhichOneof("value"))
  
      # JSON does not differetiate between int and double, but MLMD value type does.
      # MLMD int is stored as double as a result.
      struct_proto.update(metadata)
      return struct_proto
  
imports: import itertools
  import json
  import os
  import re
  from typing import Any, Dict, List, Mapping, Optional, Type, Union
  from kfp.pipeline_spec import pipeline_spec_pb2
  from tfx import types
  from tfx.dsl.io import fileio
  from tfx.orchestration import data_types
  from tfx.orchestration.kubeflow.v2 import parameter_utils
  from tfx.proto.orchestration import placeholder_pb2
  from tfx.types import artifact
  from tfx.types import channel
  from tfx.types import standard_artifacts
  from tfx.types.experimental import simple_artifacts
  from tfx.utils import json_utils
  from tfx.utils import name_utils
  import yaml
  from google.protobuf import struct_pb2
  from google.protobuf import json_format
  from google.protobuf import message
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 7 for calling a global function with example usage: pack_artifact_properties(artifact_instance) and returns: struct_proto