<?php 
 
/* 
 * This file is part of Chevere. 
 * 
 * (c) Rodolfo Berrios <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
declare(strict_types=1); 
 
namespace Chevere\Workflow\Exceptions; 
 
use Chevere\Workflow\Interfaces\JobInterface; 
use Exception; 
use Throwable; 
use function Chevere\Message\message; 
 
/** 
 * Exception thrown by a Workflow participant. 
 */ 
abstract class WorkflowException extends Exception 
{ 
    /** 
     * The job name that thrown the exception. 
     */ 
    public readonly string $name; 
 
    /** 
     * The job that thrown the exception. 
     */ 
    public readonly JobInterface $job; 
 
    /** 
     * The exception thrown by the job. 
     */ 
    public readonly Throwable $throwable; 
 
    public function __construct( 
        string $name, 
        JobInterface $job, 
        Throwable $throwable, 
    ) { 
        $message = (string) message( 
            $this->template(), 
            name: $name, 
            message: $throwable->getMessage(), 
            caller: $job->caller() 
        ); 
        parent::__construct(message: $message, previous: $throwable); 
        $this->name = $name; 
        $this->job = $job; 
        $this->throwable = $throwable; 
        $this->file = $job->caller()->file(); 
        $this->line = $job->caller()->line(); 
    } 
 
    protected function template(): string 
    { 
        return '[%name%]: %message%'; 
    } 
} 
 
 |