1<?php
2
3/**
4 * Fluent interface for validating the contents of member variables.
5 * This should be immutable. See HTMLPurifier_ConfigSchema_Validator for
6 * use-cases. We name this an 'atom' because it's ONLY for validations that
7 * are independent and usually scalar.
8 */
9class HTMLPurifier_ConfigSchema_ValidatorAtom
10{
11    /**
12     * @type string
13     */
14    protected $context;
15
16    /**
17     * @type object
18     */
19    protected $obj;
20
21    /**
22     * @type string
23     */
24    protected $member;
25
26    /**
27     * @type mixed
28     */
29    protected $contents;
30
31    public function __construct($context, $obj, $member)
32    {
33        $this->context = $context;
34        $this->obj = $obj;
35        $this->member = $member;
36        $this->contents =& $obj->$member;
37    }
38
39    /**
40     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
41     */
42    public function assertIsString()
43    {
44        if (!is_string($this->contents)) {
45            $this->error('must be a string');
46        }
47        return $this;
48    }
49
50    /**
51     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
52     */
53    public function assertIsBool()
54    {
55        if (!is_bool($this->contents)) {
56            $this->error('must be a boolean');
57        }
58        return $this;
59    }
60
61    /**
62     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
63     */
64    public function assertIsArray()
65    {
66        if (!is_array($this->contents)) {
67            $this->error('must be an array');
68        }
69        return $this;
70    }
71
72    /**
73     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
74     */
75    public function assertNotNull()
76    {
77        if ($this->contents === null) {
78            $this->error('must not be null');
79        }
80        return $this;
81    }
82
83    /**
84     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
85     */
86    public function assertAlnum()
87    {
88        $this->assertIsString();
89        if (!ctype_alnum($this->contents)) {
90            $this->error('must be alphanumeric');
91        }
92        return $this;
93    }
94
95    /**
96     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
97     */
98    public function assertNotEmpty()
99    {
100        if (empty($this->contents)) {
101            $this->error('must not be empty');
102        }
103        return $this;
104    }
105
106    /**
107     * @return HTMLPurifier_ConfigSchema_ValidatorAtom
108     */
109    public function assertIsLookup()
110    {
111        $this->assertIsArray();
112        foreach ($this->contents as $v) {
113            if ($v !== true) {
114                $this->error('must be a lookup array');
115            }
116        }
117        return $this;
118    }
119
120    /**
121     * @param string $msg
122     * @throws HTMLPurifier_ConfigSchema_Exception
123     */
124    protected function error($msg)
125    {
126        throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg);
127    }
128}
129
130// vim: et sw=4 sts=4
131