123456789101112131415161718192021222324252627282930313233343536373839404142434445(** Error types for testcontainers *)typet=|Container_not_foundofstring|Container_not_runningofstring|Container_start_failedof{id:string;message:string}|Container_stop_failedof{id:string;message:string}|Wait_timeoutof{strategy:string;timeout:float}|Docker_errorof{status:int;message:string}|Docker_connection_failedofstring|Invalid_configurationofstring|Image_pull_failedof{image:string;message:string}|Port_not_mappedof{container_port:int;protocol:string}exceptionTestcontainers_erroroftletto_string=function|Container_not_foundid->Printf.sprintf"Container not found: %s"id|Container_not_runningid->Printf.sprintf"Container not running: %s"id|Container_start_failed{id;message}->Printf.sprintf"Failed to start container %s: %s"idmessage|Container_stop_failed{id;message}->Printf.sprintf"Failed to stop container %s: %s"idmessage|Wait_timeout{strategy;timeout}->Printf.sprintf"Wait strategy '%s' timed out after %.1fs"strategytimeout|Docker_error{status;message}->Printf.sprintf"Docker API error (status %d): %s"statusmessage|Docker_connection_failedmsg->Printf.sprintf"Failed to connect to Docker daemon: %s"msg|Invalid_configurationmsg->Printf.sprintf"Invalid configuration: %s"msg|Image_pull_failed{image;message}->Printf.sprintf"Failed to pull image %s: %s"imagemessage|Port_not_mapped{container_port;protocol}->Printf.sprintf"Port %d/%s not mapped"container_portprotocolletraise_errorerr=raise(Testcontainers_errorerr)letfail_container_not_foundid=raise_error(Container_not_foundid)letfail_docker_error~status~message=raise_error(Docker_error{status;message})letfail_invalid_configmsg=raise_error(Invalid_configurationmsg)letfail_wait_timeout~strategy~timeout=raise_error(Wait_timeout{strategy;timeout})