     1: <?php
     2: /**
     3:  * Copyright 2012-2014 Rackspace US, Inc.
     4:  *
     5:  * Licensed under the Apache License, Version 2.0 (the "License");
     6:  * you may not use this file except in compliance with the License.
     7:  * You may obtain a copy of the License at
     8:  *
     9:  * http://www.apache.org/licenses/LICENSE-2.0
    10:  *
    11:  * Unless required by applicable law or agreed to in writing, software
    12:  * distributed under the License is distributed on an "AS IS" BASIS,
    13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14:  * See the License for the specific language governing permissions and
    15:  * limitations under the License.
    16:  */
    17:
    18: namespace OpenCloud\Image\Resource\JsonPatch;
    19:
    20: use OpenCloud\Image\Enum\Document as DocumentEnum;
    21:
    22: /**
    23:  * Class that encodes a JSON document object into a flat string format
    24:  *
    25:  * @package OpenCloud\Images\Resource\JsonPatch
    26:  */
    27: class Encoder
    28: {
    29:     /** @var array Required transformations for reserved characters */
    30:     protected static $transformations = array(
    31:         '~' => '~0',
    32:         '/' => '~1'
    33:     );
    34:
    35:     /**
    36:      * Encode the
    37:      * @param array $operations
    38:      * @return string
    39:      */
    40:     public static function encode(array $operations)
    41:     {
    42:         $lines = array();
    43:
    44:         foreach ($operations as $operation) {
    45:             $lines[] = sprintf(
    46:                 '{"%s": "%s", "%s": "%s", "%s": "%s"}',
    47:                 DocumentEnum::OP, $operation->getType(),
    48:                 DocumentEnum::PATH, $operation->getPath(),
    49:                 DocumentEnum::VALUE, self::transform($operation->getValue())
    50:             );
    51:         }
    52:
    53:         return sprintf('[%s]', implode($lines, ','));
    54:     }
    55:
    56:     /**
    57:      * Search a given string and transform any reserved characters into their safe version
    58:      *
    59:      * @param $value
    60:      * @return string
    61:      */
    62:     public static function transform($value)
    63:     {
    64:         return strtr((string) $value, self::$transformations);
    65:     }
    66: }
    67: