1: <?php declare(strict_types=1);
2:
3: namespace Salient\Contract\Core\Entity;
4:
5: use Salient\Contract\Core\DateFormatterInterface;
6: use Salient\Contract\Core\Immutable;
7: use Closure;
8:
9: /**
10: * @api
11: *
12: * @template TEntity of object
13: */
14: interface SerializeRulesInterface extends Immutable
15: {
16: /**
17: * Get the entity to which the instance applies
18: *
19: * @return class-string<TEntity>
20: */
21: public function getEntity(): string;
22:
23: /**
24: * Check if path-based rules are applied to nested instances of the entity
25: */
26: public function getRecurseRules(): bool;
27:
28: /**
29: * Get an instance that applies path-based rules to nested instances of the
30: * entity
31: *
32: * @return static
33: */
34: public function withRecurseRules(?bool $recurse = true): self;
35:
36: /**
37: * Merge with another instance, giving precedence to its values if there are
38: * any conflicts
39: *
40: * @param static $rules Must apply to the same entity or one of its
41: * subclasses.
42: * @return static
43: */
44: public function merge(self $rules): self;
45:
46: /**
47: * Get keys to remove from a serialized class at a given path
48: *
49: * If `$baseClass` is given, rules applied to `$class` and its parents up to
50: * but not including `$baseClass` are inherited, otherwise the only
51: * class-based rules used are those applied directly to `$class`.
52: *
53: * @template T0 of object
54: * @template T1 of T0
55: *
56: * @param class-string<T1>|null $class
57: * @param class-string<T0>|null $baseClass
58: * @param string[] $path
59: * @return array<string,string> Keys are mapped to themselves.
60: */
61: public function getRemovableKeys(?string $class, ?string $baseClass, array $path): array;
62:
63: /**
64: * Get keys to replace in a serialized class at a given path
65: *
66: * If `$baseClass` is given, rules applied to `$class` and its parents up to
67: * but not including `$baseClass` are inherited, otherwise the only
68: * class-based rules used are those applied directly to `$class`.
69: *
70: * @template T0 of object
71: * @template T1 of T0
72: *
73: * @param class-string<T1>|null $class
74: * @param class-string<T0>|null $baseClass
75: * @param string[] $path
76: * @return array<string,array{string|null,(Closure(mixed $value): mixed)|null}> Each
77: * key is mapped to an array with two values, one of which may be `null`:
78: * - a new key for the value
79: * - a closure to return a new value for the key
80: */
81: public function getReplaceableKeys(?string $class, ?string $baseClass, array $path): array;
82:
83: /**
84: * Get the date formatter applied to the instance
85: */
86: public function getDateFormatter(): ?DateFormatterInterface;
87:
88: /**
89: * Get an instance with a given date formatter
90: *
91: * @return static
92: */
93: public function withDateFormatter(?DateFormatterInterface $formatter): self;
94:
95: /**
96: * Check if dynamic properties should be included when the entity is
97: * serialized
98: */
99: public function getDynamicProperties(): bool;
100:
101: /**
102: * Get an instance where dynamic properties are included when the entity is
103: * serialized
104: *
105: * @return static
106: */
107: public function withDynamicProperties(?bool $include = true): self;
108:
109: /**
110: * Check if serialized entities should be sorted by key
111: */
112: public function getSortByKey(): bool;
113:
114: /**
115: * Get an instance where serialized entities are sorted by key
116: *
117: * @return static
118: */
119: public function withSortByKey(?bool $sort = true): self;
120:
121: /**
122: * Get the maximum depth of nested values
123: */
124: public function getMaxDepth(): int;
125:
126: /**
127: * Get an instance where the maximum depth of nested values is a given value
128: *
129: * @return static
130: */
131: public function withMaxDepth(?int $depth): self;
132:
133: /**
134: * Check if recursion detection should be enabled when nested entities are
135: * serialized
136: */
137: public function getDetectRecursion(): bool;
138:
139: /**
140: * Get an instance where recursion detection is enabled
141: *
142: * If circular references cannot arise when the entity is serialized,
143: * recursion detection should be disabled to improve performance and reduce
144: * memory consumption.
145: *
146: * @return static
147: */
148: public function withDetectRecursion(?bool $detect = true): self;
149: }
150: