comparison vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2 namespace GuzzleHttp\Psr7;
3
4 use Psr\Http\Message\StreamInterface;
5
6 /**
7 * Stream decorator trait
8 * @property StreamInterface stream
9 */
10 trait StreamDecoratorTrait
11 {
12 /**
13 * @param StreamInterface $stream Stream to decorate
14 */
15 public function __construct(StreamInterface $stream)
16 {
17 $this->stream = $stream;
18 }
19
20 /**
21 * Magic method used to create a new stream if streams are not added in
22 * the constructor of a decorator (e.g., LazyOpenStream).
23 *
24 * @param string $name Name of the property (allows "stream" only).
25 *
26 * @return StreamInterface
27 */
28 public function __get($name)
29 {
30 if ($name == 'stream') {
31 $this->stream = $this->createStream();
32 return $this->stream;
33 }
34
35 throw new \UnexpectedValueException("$name not found on class");
36 }
37
38 public function __toString()
39 {
40 try {
41 if ($this->isSeekable()) {
42 $this->seek(0);
43 }
44 return $this->getContents();
45 } catch (\Exception $e) {
46 // Really, PHP? https://bugs.php.net/bug.php?id=53648
47 trigger_error('StreamDecorator::__toString exception: '
48 . (string) $e, E_USER_ERROR);
49 return '';
50 }
51 }
52
53 public function getContents()
54 {
55 return copy_to_string($this);
56 }
57
58 /**
59 * Allow decorators to implement custom methods
60 *
61 * @param string $method Missing method name
62 * @param array $args Method arguments
63 *
64 * @return mixed
65 */
66 public function __call($method, array $args)
67 {
68 $result = call_user_func_array([$this->stream, $method], $args);
69
70 // Always return the wrapped object if the result is a return $this
71 return $result === $this->stream ? $this : $result;
72 }
73
74 public function close()
75 {
76 $this->stream->close();
77 }
78
79 public function getMetadata($key = null)
80 {
81 return $this->stream->getMetadata($key);
82 }
83
84 public function detach()
85 {
86 return $this->stream->detach();
87 }
88
89 public function getSize()
90 {
91 return $this->stream->getSize();
92 }
93
94 public function eof()
95 {
96 return $this->stream->eof();
97 }
98
99 public function tell()
100 {
101 return $this->stream->tell();
102 }
103
104 public function isReadable()
105 {
106 return $this->stream->isReadable();
107 }
108
109 public function isWritable()
110 {
111 return $this->stream->isWritable();
112 }
113
114 public function isSeekable()
115 {
116 return $this->stream->isSeekable();
117 }
118
119 public function rewind()
120 {
121 $this->seek(0);
122 }
123
124 public function seek($offset, $whence = SEEK_SET)
125 {
126 $this->stream->seek($offset, $whence);
127 }
128
129 public function read($length)
130 {
131 return $this->stream->read($length);
132 }
133
134 public function write($string)
135 {
136 return $this->stream->write($string);
137 }
138
139 /**
140 * Implement in subclasses to dynamically create streams when requested.
141 *
142 * @return StreamInterface
143 * @throws \BadMethodCallException
144 */
145 protected function createStream()
146 {
147 throw new \BadMethodCallException('Not implemented');
148 }
149 }