1: <?php
2:
3: namespace Hyperwallet\Util;
4:
5: /**
6: * A simple implementation of https://www.rfc-editor.org/rfc/rfc6570 for expanding Hyperwallet
7: * Uniform Resource Identifier (URI) Template.
8: *
9: * This class was created to allow the Hyperwallet SDK to support by PHP 5.6 and latest version
10: * @package Hyperwallet\Util
11: */
12: final class HyperwalletUriTemplate
13: {
14:
15: /**
16: * Regex pattern to find variable identifier defined by pair of braces ('{', '}').
17: * e.g. {var}
18: */
19: const PATTERN = '/\{([^\}]+)\}/';
20:
21: /**
22: * Processes URI Template
23: *
24: * This implementation will replace simple key defined in pair of braces ('{', '}') and replaced for the associate
25: * variable value.
26: *
27: * E.g. $uriTemplate = `test/{var-a}/{var-b}`, $variables = array('var-a' => 'testA', 'var-b' => 'testB') will return
28: * test/testA/testB
29: *
30: * @param string $uriTemplate the URI Template is a string that
31: * contains zero or more embedded variable expressions delimited by pair of braces ('{', '}').
32: * @param array $variables the variable identifiers for associating values within a template
33: * processor
34: * @return string
35: */
36: public function expand($uriTemplate, array $variables)
37: {
38: if (!$variables || strpos($uriTemplate, '{') === false) {
39: // skip processing
40: return $uriTemplate;
41: }
42:
43: return \preg_replace_callback(
44: self::PATTERN,
45: self::buildProcessMatchResult($variables),
46: $uriTemplate
47: );
48: }
49:
50: /**
51: * Evaluates the match result and find the associated value from the defined variables
52: * @param array $matches the match results
53: * @param array $variables the variable identifiers for associating values within a template
54: * processor
55: * @return mixed
56: */
57: private static function processMatchResult(array $matches, array $variables)
58: {
59: if (!isset($variables[$matches[1]])) {
60: // missing variable definition, return the match key
61: return $matches[0];
62: }
63:
64: return $variables[$matches[1]];
65: }
66:
67: /**
68: * Builds an anonymous functions to process the match result
69: * @param array $variables
70: * @return \Closure
71: */
72: private static function buildProcessMatchResult(array $variables)
73: {
74: return static function (array $matches) use ($variables) {
75: return self::processMatchResult($matches, $variables);
76: };
77: }
78: }