LCOV - code coverage report
Current view: top level - util - merchant_parse.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 90.6 % 32 29
Test Date: 2026-09-11 17:45:24 Functions: 100.0 % 4 4

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   (C) 2024, 2025 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify it under the
       6              :   terms of the GNU Lesser General Public License as published by the Free Software
       7              :   Foundation; either version 3, or (at your option) any later version.
       8              : 
       9              :   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
      10              :   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
      11              :   A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
      12              : 
      13              :   You should have received a copy of the GNU General Public License along with
      14              :   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
      15              : */
      16              : /**
      17              :  * @file src/util/merchant_parse.c
      18              :  * @brief shared logic for merchant metadata parsing
      19              :  * @author Iván Ávalos
      20              :  * @author Christian Grothoff
      21              :  */
      22              : #include "platform.h"
      23              : #include <gnunet/gnunet_common.h>
      24              : #include <gnunet/gnunet_json_lib.h>
      25              : #include <jansson.h>
      26              : #include <stdbool.h>
      27              : #include <stdint.h>
      28              : #include <taler/taler_json_lib.h>
      29              : #include <taler/taler_util.h>
      30              : #include "taler/taler_merchant_util.h"
      31              : 
      32              : 
      33              : /**
      34              :  * Parse merchant details of given JSON order terms.
      35              :  *
      36              :  * @param cls closure, unused parameter
      37              :  * @param root the JSON object representing data
      38              :  * @param[out] ospec where to write the data
      39              :  * @return #GNUNET_OK upon successful parsing; #GNUNET_SYSERR upon error
      40              :  */
      41              : static enum GNUNET_GenericReturnValue
      42          205 : parse_merchant_details (void *cls,
      43              :                         json_t *root,
      44              :                         struct GNUNET_JSON_Specification *ospec)
      45              : {
      46          205 :   struct TALER_MERCHANT_MetaData *merchant = ospec->ptr;
      47              :   struct GNUNET_JSON_Specification spec[] = {
      48          205 :     GNUNET_JSON_spec_string_copy ("name",
      49              :                                   &merchant->name),
      50          205 :     GNUNET_JSON_spec_mark_optional (
      51              :       GNUNET_JSON_spec_string_copy ("email",
      52              :                                     &merchant->email),
      53              :       NULL),
      54          205 :     GNUNET_JSON_spec_mark_optional (
      55              :       TALER_JSON_spec_web_url_copy ("website",
      56              :                                     &merchant->website),
      57              :       NULL),
      58          205 :     GNUNET_JSON_spec_mark_optional (
      59              :       GNUNET_JSON_spec_string_copy ("logo",
      60              :                                     &merchant->logo),
      61              :       NULL),
      62          205 :     GNUNET_JSON_spec_mark_optional (
      63              :       GNUNET_JSON_spec_object_copy ("address",
      64              :                                     &merchant->address),
      65              :       NULL),
      66          205 :     GNUNET_JSON_spec_mark_optional (
      67              :       GNUNET_JSON_spec_object_copy ("jurisdiction",
      68              :                                     &merchant->jurisdiction),
      69              :       NULL),
      70          205 :     GNUNET_JSON_spec_end ()
      71              :   };
      72              :   const char *error_name;
      73              :   unsigned int error_line;
      74              : 
      75              :   (void) cls;
      76          205 :   if (GNUNET_OK !=
      77          205 :       GNUNET_JSON_parse (root,
      78              :                          spec,
      79              :                          &error_name,
      80              :                          &error_line))
      81              :   {
      82            0 :     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
      83              :                 "Failed to parse %s at %u: %s\n",
      84              :                 spec[error_line].field,
      85              :                 error_line,
      86              :                 error_name);
      87            0 :     GNUNET_break_op (0);
      88            0 :     return GNUNET_SYSERR;
      89              :   }
      90          205 :   return GNUNET_OK;
      91              : }
      92              : 
      93              : 
      94              : json_t *
      95          116 : TALER_MERCHANT_metadata_to_json (
      96              :   const struct TALER_MERCHANT_MetaData *merchant)
      97              : {
      98          116 :   return GNUNET_JSON_PACK (
      99              :     GNUNET_JSON_pack_string ("name",
     100              :                              merchant->name),
     101              :     GNUNET_JSON_pack_allow_null (
     102              :       GNUNET_JSON_pack_string ("email",
     103              :                                merchant->email)),
     104              :     GNUNET_JSON_pack_allow_null (
     105              :       GNUNET_JSON_pack_string ("website",
     106              :                                merchant->website)),
     107              :     GNUNET_JSON_pack_allow_null (
     108              :       GNUNET_JSON_pack_string ("logo",
     109              :                                merchant->logo)),
     110              :     GNUNET_JSON_pack_allow_null (
     111              :       GNUNET_JSON_pack_object_incref ("address",
     112              :                                       merchant->address)),
     113              :     GNUNET_JSON_pack_allow_null (
     114              :       GNUNET_JSON_pack_object_incref ("jurisdiction",
     115              :                                       merchant->jurisdiction)));
     116              : }
     117              : 
     118              : 
     119              : struct GNUNET_JSON_Specification
     120          205 : TALER_MERCHANT_spec_merchant_details (
     121              :   const char *name,
     122              :   struct TALER_MERCHANT_MetaData *merchant)
     123              : {
     124          205 :   struct GNUNET_JSON_Specification ret = {
     125              :     .parser = &parse_merchant_details,
     126              :     .field = name,
     127              :     .ptr = merchant,
     128              :   };
     129              : 
     130          205 :   return ret;
     131              : }
     132              : 
     133              : 
     134              : void
     135          204 : TALER_MERCHANT_metadata_free (
     136              :   struct TALER_MERCHANT_MetaData *merchant)
     137              : {
     138          204 :   GNUNET_free (merchant->name);
     139          204 :   GNUNET_free (merchant->website);
     140          204 :   GNUNET_free (merchant->email);
     141          204 :   GNUNET_free (merchant->logo);
     142          204 :   if (NULL != merchant->address)
     143              :   {
     144          204 :     json_decref (merchant->address);
     145          204 :     merchant->address = NULL;
     146              :   }
     147          204 :   if (NULL != merchant->jurisdiction)
     148              :   {
     149          204 :     json_decref (merchant->jurisdiction);
     150          204 :     merchant->jurisdiction = NULL;
     151              :   }
     152          204 : }
        

Generated by: LCOV version 2.0-1