blob: 3ef6da934982ff0e1f5fa572337bf3abfc72d409 [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
2
3namespace PhpMimeMailParser;
4
5use PhpMimeMailParser\Contracts\MiddleWare as MiddleWareContracts;
6
7/**
8 * A stack of middleware chained together by (MiddlewareStack $next)
9 */
10class MiddlewareStack
11{
12 /**
13 * Next MiddlewareStack in chain
14 *
15 * @var MiddlewareStack
16 */
17 protected $next;
18
19 /**
20 * Middleware in this MiddlewareStack
21 *
22 * @var Middleware
23 */
24 protected $middleware;
25
26 /**
27 * Construct the first middleware in this MiddlewareStack
28 * The next middleware is chained through $MiddlewareStack->add($Middleware)
29 *
30 * @param Middleware $middleware
31 */
32 public function __construct(MiddleWareContracts $middleware = null)
33 {
34 $this->middleware = $middleware;
35 }
36
37 /**
38 * Creates a chained middleware in MiddlewareStack
39 *
40 * @param Middleware $middleware
41 * @return MiddlewareStack Immutable MiddlewareStack
42 */
43 public function add(MiddleWareContracts $middleware)
44 {
45 $stack = new static($middleware);
46 $stack->next = $this;
47 return $stack;
48 }
49
50 /**
51 * Parses the MimePart by passing it through the Middleware
52 * @param MimePart $part
53 * @return MimePart
54 */
55 public function parse(MimePart $part)
56 {
57 if (!$this->middleware) {
58 return $part;
59 }
60 $part = call_user_func(array($this->middleware, 'parse'), $part, $this->next);
61 return $part;
62 }
63
64 /**
65 * Creates a MiddlewareStack based on an array of middleware
66 *
67 * @param Middleware[] $middlewares
68 * @return MiddlewareStack
69 */
70 public static function factory(array $middlewares = array())
71 {
72 $stack = new static;
73 foreach ($middlewares as $middleware) {
74 $stack = $stack->add($middleware);
75 }
76 return $stack;
77 }
78
79 /**
80 * Allow calling MiddlewareStack instance directly to invoke parse()
81 *
82 * @param MimePart $part
83 * @return MimePart
84 */
85 public function __invoke(MimePart $part)
86 {
87 return $this->parse($part);
88 }
89}