Fix a few issues with the C generator (part 2) (#20227)

* [C] Don't convert post body strings to JSON

If the body provided for the api request is a just a string itself,
don't try to convert it to JSON, simply submit the string.

* [C] Implement BearerToken authentication

* [C] Handle nullable fields correctly

* [C] Fix implementation of FromString for enums

* [C] Update the test schemas to cover the changes

* Update samples

* Fix the updated samples

* [C] Add the new samples folder to the CI workflow
This commit is contained in:
Ernesto Fernández 2024-12-05 14:32:34 -03:00 committed by GitHub
parent 387fd9986c
commit 52b5b8fb76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
70 changed files with 6200 additions and 31 deletions

View File

@ -5,10 +5,12 @@ on:
paths: paths:
- 'samples/client/petstore/c/**' - 'samples/client/petstore/c/**'
- 'samples/client/petstore/c-useJsonUnformatted/**' - 'samples/client/petstore/c-useJsonUnformatted/**'
- 'samples/client/others/c/bearerAuth/**'
pull_request: pull_request:
paths: paths:
- 'samples/client/petstore/c/**' - 'samples/client/petstore/c/**'
- 'samples/client/petstore/c-useJsonUnformatted/**' - 'samples/client/petstore/c-useJsonUnformatted/**'
- 'samples/client/others/c/bearerAuth/**'
jobs: jobs:
build: build:
@ -20,6 +22,7 @@ jobs:
sample: sample:
- 'samples/client/petstore/c/' - 'samples/client/petstore/c/'
- 'samples/client/petstore/c-useJsonUnformatted/' - 'samples/client/petstore/c-useJsonUnformatted/'
- 'samples/client/others/c/bearerAuth/'
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View File

@ -0,0 +1,4 @@
generatorName: c
outputDir: samples/client/others/c/bearerAuth
inputSpec: modules/openapi-generator/src/test/resources/3_0/c/bearer_auth.yaml
templateDir: modules/openapi-generator/src/main/resources/C-libcurl

View File

@ -324,6 +324,10 @@ end:
} }
{{/isArray}} {{/isArray}}
{{^isArray}} {{^isArray}}
{{#isString}}
localVarBodyParameters = strdup({{paramName}});
{{/isString}}
{{^isString}}
cJSON *localVarSingleItemJSON_{{paramName}} = NULL; cJSON *localVarSingleItemJSON_{{paramName}} = NULL;
if ({{paramName}} != NULL) if ({{paramName}} != NULL)
{ {
@ -331,6 +335,7 @@ end:
localVarSingleItemJSON_{{paramName}} = {{dataType}}_convertToJSON({{paramName}}); localVarSingleItemJSON_{{paramName}} = {{dataType}}_convertToJSON({{paramName}});
localVarBodyParameters = {{{cJSONPrint}}}(localVarSingleItemJSON_{{paramName}}); localVarBodyParameters = {{{cJSONPrint}}}(localVarSingleItemJSON_{{paramName}});
} }
{{/isString}}
{{/isArray}} {{/isArray}}
{{/bodyParam}} {{/bodyParam}}
{{#produces}} {{#produces}}
@ -458,10 +463,12 @@ end:
free(localVarBodyParameters); free(localVarBodyParameters);
{{/isArray}} {{/isArray}}
{{^isArray}} {{^isArray}}
{{^isString}}
if (localVarSingleItemJSON_{{paramName}}) { if (localVarSingleItemJSON_{{paramName}}) {
cJSON_Delete(localVarSingleItemJSON_{{paramName}}); cJSON_Delete(localVarSingleItemJSON_{{paramName}});
localVarSingleItemJSON_{{paramName}} = NULL; localVarSingleItemJSON_{{paramName}} = NULL;
} }
{{/isString}}
free(localVarBodyParameters); free(localVarBodyParameters);
{{/isArray}} {{/isArray}}
{{/bodyParams}} {{/bodyParams}}

View File

@ -22,6 +22,9 @@ apiClient_t *apiClient_create() {
apiClient->username = NULL; apiClient->username = NULL;
apiClient->password = NULL; apiClient->password = NULL;
{{/isBasicBasic}} {{/isBasicBasic}}
{{#isBasicBearer}}
apiClient->accessToken = NULL;
{{/isBasicBearer}}
{{#isOAuth}} {{#isOAuth}}
apiClient->accessToken = NULL; apiClient->accessToken = NULL;
{{/isOAuth}} {{/isOAuth}}
@ -69,6 +72,9 @@ apiClient_t *apiClient_create_with_base_path(const char *basePath
apiClient->username = NULL; apiClient->username = NULL;
apiClient->password = NULL; apiClient->password = NULL;
{{/isBasicBasic}} {{/isBasicBasic}}
{{#isBasicBearer}}
apiClient->accessToken = NULL;
{{/isBasicBearer}}
{{#isOAuth}} {{#isOAuth}}
apiClient->accessToken = NULL; apiClient->accessToken = NULL;
{{/isOAuth}} {{/isOAuth}}
@ -108,6 +114,11 @@ void apiClient_free(apiClient_t *apiClient) {
free(apiClient->password); free(apiClient->password);
} }
{{/isBasicBasic}} {{/isBasicBasic}}
{{#isBasicBearer}}
if(apiClient->accessToken) {
free(apiClient->accessToken);
}
{{/isBasicBearer}}
{{#isOAuth}} {{#isOAuth}}
if(apiClient->accessToken) { if(apiClient->accessToken) {
free(apiClient->accessToken); free(apiClient->accessToken);
@ -467,6 +478,20 @@ void apiClient_invoke(apiClient_t *apiClient,
} }
} }
{{/isApiKey}} {{/isApiKey}}
{{#isBasicBearer}}
// this would only be generated for bearer token authentication
if(apiClient->accessToken != NULL)
{
int authHeaderSize;
char *authHeader = NULL;
authHeaderSize = snprintf(NULL, 0, "Authorization: Bearer %s", apiClient->accessToken) + 1;
authHeader = malloc(authHeaderSize);
snprintf(authHeader, authHeaderSize, "Authorization: Bearer %s", apiClient->accessToken);
headers = curl_slist_append(headers, authHeader);
free(authHeader);
}
{{/isBasicBearer}}
{{/authMethods}} {{/authMethods}}
{{/hasAuthMethods}} {{/hasAuthMethods}}

View File

@ -34,6 +34,9 @@ typedef struct apiClient_t {
char *username; char *username;
char *password; char *password;
{{/isBasicBasic}} {{/isBasicBasic}}
{{#isBasicBearer}}
char *accessToken;
{{/isBasicBearer}}
{{#isOAuth}} {{#isOAuth}}
char *accessToken; char *accessToken;
{{/isOAuth}} {{/isOAuth}}

View File

@ -49,27 +49,20 @@ fail:
} }
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}_parseFromJSON(cJSON *{{classname}}JSON) { {{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}_parseFromJSON(cJSON *{{classname}}JSON) {
{{projectName}}_{{classVarName}}_{{enumName}}_e *{{classname}} = NULL;
{{#isEnum}} {{#isEnum}}
{{#isNumeric}} {{#isNumeric}}
cJSON *{{{classname}}}Var = cJSON_GetObjectItemCaseSensitive({{classname}}JSON, "{{{classname}}}"); if(!cJSON_IsNumber({{{classname}}}JSON)) {
if(!cJSON_IsNumber({{{classname}}}Var)) return 0;
{
goto end;
} }
return {{classname}}JSON->valueint;
{{/isNumeric}} {{/isNumeric}}
{{#isString}} {{#isString}}
{{projectName}}_{{classVarName}}_{{enumName}}_e {{classname}}Variable; if(!cJSON_IsString({{{classname}}}JSON) || ({{{classname}}}JSON->valuestring == NULL)) {
cJSON *{{{classname}}}Var = cJSON_GetObjectItemCaseSensitive({{classname}}JSON, "{{{classname}}}"); return 0;
if(!cJSON_IsString({{{classname}}}Var) || ({{{classname}}}Var->valuestring == NULL)){
goto end;
} }
{{classname}}Variable = {{classFilename}}_{{classname}}_FromString({{{classname}}}Var->valuestring); return {{classFilename}}_{{classname}}_FromString({{{classname}}}JSON->valuestring);
{{/isString}} {{/isString}}
{{/isEnum}} {{/isEnum}}
return {{classname}}Variable;
end:
return 0;
} }
{{/isEnum}} {{/isEnum}}
{{^isEnum}} {{^isEnum}}
@ -623,6 +616,9 @@ fail:
{{#vars}} {{#vars}}
// {{{classname}}}->{{{name}}} // {{{classname}}}->{{{name}}}
cJSON *{{{name}}} = cJSON_GetObjectItemCaseSensitive({{classname}}JSON, "{{{baseName}}}"); cJSON *{{{name}}} = cJSON_GetObjectItemCaseSensitive({{classname}}JSON, "{{{baseName}}}");
if (cJSON_IsNull({{{name}}})) {
{{{name}}} = NULL;
}
{{#required}} {{#required}}
if (!{{{name}}}) { if (!{{{name}}}) {
goto end; goto end;

View File

@ -253,6 +253,26 @@ paths:
- petstore_auth: - petstore_auth:
- 'write:pets' - 'write:pets'
- 'read:pets' - 'read:pets'
/pet/picture:
post:
tags:
- pet
summary: Send a picture of your happy pet
description: ''
operationId: sharePicture
parameters:
- in: body
name: picture
description: A picture you want to share
required: true
schema:
type: string
responses:
'200':
description: successful operation
schema:
type: string
description: Thank you message
'/pet/{petId}/uploadImage': '/pet/{petId}/uploadImage':
post: post:
tags: tags:
@ -290,6 +310,31 @@ paths:
- petstore_auth: - petstore_auth:
- 'write:pets' - 'write:pets'
- 'read:pets' - 'read:pets'
'/pet/{petId}/isAvailable':
post:
tags:
- pet
summary: Is this pet still available?
description: ''
operationId: isPetAvailable
produces:
- application/json
parameters:
- name: petId
in: path
description: ID of pet to check
required: true
type: integer
format: int64
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Bit'
security:
- petstore_auth:
- 'write:pets'
- 'read:pets'
/store/inventory: /store/inventory:
get: get:
tags: tags:
@ -775,3 +820,9 @@ definitions:
uniqueItems: true uniqueItems: true
items: items:
type: string type: string
Bit:
description: bit value
type: number
enum:
- 0
- 1

View File

@ -0,0 +1,58 @@
# Copied from k6
openapi: 3.0.0
info:
title: Sample API
description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML.
version: 0.1.9
servers:
- url: http://api.example.com/v1
description: Optional server description, e.g. Main (production) server
- url: http://staging-api.example.com
description: Optional server description, e.g. Internal staging server for testing
security:
- bearerAuth: []
paths:
/users:
get:
summary: Returns a list of users.
description: Optional extended description in CommonMark or HTML.
responses:
"200": # status code
description: A JSON array of user names
content:
application/json:
schema:
type: array
items:
type: string
security:
- bearerAuth: []
/public:
get:
summary: Returns public information.
description: This endpoint does not require authentication.
responses:
"200":
description: A JSON object with public information
content:
application/json:
schema:
type: object
security: []
/private:
get:
summary: Returns private information.
description: This endpoint requires global security settings.
responses:
"200":
description: A JSON object with private information
content:
application/json:
schema:
type: object
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT # Optional: specify the format (e.g., JWT) if applicable

View File

@ -0,0 +1,23 @@
# OpenAPI Generator Ignore
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
# Use this file to prevent files from being overwritten by the generator.
# The patterns follow closely to .gitignore or .dockerignore.
# As an example, the C# client generator defines ApiClient.cs.
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
#ApiClient.cs
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
#foo/*/qux
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
#foo/**/qux
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
# You can also negate patterns with an exclamation (!).
# For example, you can ignore all files in a docs folder with the file extension .md:
#docs/*.md
# Then explicitly reverse the ignore rule for a single file:
#!docs/README.md

View File

@ -0,0 +1,22 @@
CMakeLists.txt
Packing.cmake
README.md
api/DefaultAPI.c
api/DefaultAPI.h
docs/DefaultAPI.md
external/cJSON.c
external/cJSON.h
external/cJSON.licence
include/apiClient.h
include/binary.h
include/keyValuePair.h
include/list.h
libcurl.licence
model/any_type.h
model/object.c
model/object.h
src/apiClient.c
src/apiKey.c
src/binary.c
src/list.c
uncrustify-rules.cfg

View File

@ -0,0 +1 @@
7.11.0-SNAPSHOT

View File

@ -0,0 +1,168 @@
cmake_minimum_required (VERSION 2.6...3.10.2)
project (CGenerator)
cmake_policy(SET CMP0063 NEW)
set(CMAKE_C_VISIBILITY_PRESET default)
set(CMAKE_CXX_VISIBILITY_PRESET default)
set(CMAKE_VISIBILITY_INLINES_HIDDEN OFF)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
find_package(OpenSSL)
if (OPENSSL_FOUND)
message (STATUS "OPENSSL found")
set(CMAKE_C_FLAGS "-DOPENSSL")
if(CMAKE_VERSION VERSION_LESS 3.4)
include_directories(${OPENSSL_INCLUDE_DIR})
include_directories(${OPENSSL_INCLUDE_DIRS})
link_directories(${OPENSSL_LIBRARIES})
endif()
message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
else()
message (STATUS "OpenSSL Not found.")
endif()
set(pkgName "sample_api")
# this default version can be overridden in PreTarget.cmake
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 0)
set(PROJECT_VERSION_PATCH 1)
if( (DEFINED CURL_INCLUDE_DIR) AND (DEFINED CURL_LIBRARIES))
include_directories(${CURL_INCLUDE_DIR})
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${CURL_LIBRARIES} )
else()
find_package(CURL 7.58.0 REQUIRED)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${CURL_LIBRARIES} )
else(CURL_FOUND)
message(FATAL_ERROR "Could not find the CURL library and development files.")
endif()
endif()
set(SRCS
src/list.c
src/apiKey.c
src/apiClient.c
src/binary.c
external/cJSON.c
model/object.c
api/DefaultAPI.c
)
set(HDRS
include/apiClient.h
include/list.h
include/binary.h
include/keyValuePair.h
external/cJSON.h
model/object.h
model/any_type.h
api/DefaultAPI.h
)
include(PreTarget.cmake OPTIONAL)
set(PROJECT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
# Add library with project file with project name as library name
add_library(${pkgName} ${SRCS} ${HDRS})
# Link dependent libraries
if(NOT CMAKE_VERSION VERSION_LESS 3.4)
target_link_libraries(${pkgName} PRIVATE OpenSSL::SSL OpenSSL::Crypto)
endif()
target_link_libraries(${pkgName} PUBLIC ${CURL_LIBRARIES} )
target_include_directories(
${pkgName} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
include(PostTarget.cmake OPTIONAL)
# installation of libraries, headers, and config files
if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in)
install(TARGETS ${pkgName} DESTINATION lib)
else()
include(GNUInstallDirs)
install(TARGETS ${pkgName} DESTINATION lib EXPORT ${pkgName}Targets)
foreach(HDR_FILE ${HDRS})
get_filename_component(HDR_DIRECTORY ${HDR_FILE} DIRECTORY)
get_filename_component(ABSOLUTE_HDR_DIRECTORY ${HDR_DIRECTORY} ABSOLUTE)
file(RELATIVE_PATH RELATIVE_HDR_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${ABSOLUTE_HDR_DIRECTORY})
install(FILES ${HDR_FILE} DESTINATION include/${pkgName}/${RELATIVE_HDR_PATH})
endforeach()
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}ConfigVersion.cmake"
VERSION "${PROJECT_VERSION_STRING}"
COMPATIBILITY AnyNewerVersion
)
export(EXPORT ${pkgName}Targets
FILE "${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Targets.cmake"
NAMESPACE ${pkgName}::
)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Config.cmake"
@ONLY
)
set(ConfigPackageLocation lib/cmake/${pkgName})
install(EXPORT ${pkgName}Targets
FILE
${pkgName}Targets.cmake
NAMESPACE
${pkgName}::
DESTINATION
${ConfigPackageLocation}
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${pkgName}/${pkgName}ConfigVersion.cmake"
DESTINATION
${ConfigPackageLocation}
)
endif()
# make installation packages
include(Packing.cmake OPTIONAL)
# Setting file variables to null
set(SRCS "")
set(HDRS "")
## This section shows how to use the above compiled library to compile the source files
## set source files
#set(SRCS
# unit-tests/manual-DefaultAPI.c
#)
##set header files
#set(HDRS
#)
## loop over all files in SRCS variable
#foreach(SOURCE_FILE ${SRCS})
# # Get only the file name from the file as add_executable does not support executable with slash("/")
# get_filename_component(FILE_NAME_ONLY ${SOURCE_FILE} NAME_WE)
# # Remove .c from the file name and set it as executable name
# string( REPLACE ".c" "" EXECUTABLE_FILE ${FILE_NAME_ONLY})
# # Add executable for every source file in SRCS
# add_executable(unit-${EXECUTABLE_FILE} ${SOURCE_FILE})
# # Link above created library to executable and dependent library curl
# target_link_libraries(unit-${EXECUTABLE_FILE} ${CURL_LIBRARIES} ${pkgName} )
#endforeach(SOURCE_FILE ${SRCS})

View File

@ -0,0 +1,24 @@
set(CPACK_PACKAGE_NAME lib${pkgName})
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_PACKAGE_DESCRIPTION_SUMMARY})
set(CPACK_PACKAGE_VENDOR ${PROJECT_PACKAGE_VENDOR})
set(CPACK_PACKAGE_CONTACT ${PROJECT_PACKAGE_CONTACT})
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${PROJECT_PACKAGE_MAINTAINER})
set(CPACK_VERBATIM_VARIABLES YES)
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEB_COMPONENT_INSTALL YES)
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS TRUE)
include(CPack)

View File

@ -0,0 +1,90 @@
# C API client for sample_api
## Overview
This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [OpenAPI spec](https://openapis.org) from a remote server, you can easily generate an API client.
- API version: 0.1.9
- Package version:
- Generator version: 7.11.0-SNAPSHOT
- Build package: org.openapitools.codegen.languages.CLibcurlClientCodegen
## Installation
You'll need the `curl 7.58.0` package in order to build the API. To have code formatted nicely, you also need to have uncrustify version 0.67 or later.
# Prerequisites
## Install the `curl 7.58.0` package with the following command on Linux.
```bash
sudo apt remove curl
wget http://curl.haxx.se/download/curl-7.58.0.tar.gz
tar -xvf curl-7.58.0.tar.gz
cd curl-7.58.0/
./configure
make
sudo make install
```
## Install the `uncrustify 0.67` package with the following command on Linux.
```bash
git clone https://github.com/uncrustify/uncrustify.git
cd uncrustify
mkdir build
cd build
cmake ..
make
sudo make install
```
## Compile the sample:
This will compile the generated code and create a library in the build folder which has to be linked to the codes where API will be used.
```bash
mkdir build
cd build
// To install library to specific location, use following commands
cmake -DCMAKE_INSTALL_PREFIX=/pathtolocation ..
// for normal install use following command
cmake ..
make
sudo make install
```
## How to use compiled library
Considering the test/source code which uses the API is written in main.c(respective api include is written and all objects necessary are defined and created)
To compile main.c(considering the file is present in build folder) use following command
-L - location of the library(not required if cmake with normal installation is performed)
-l library name
```bash
gcc main.c -L. -lsample_api -o main
```
Once compiled, you can run it with ``` ./main ```
Note: You don't need to specify includes for models and include folder separately as they are path linked. You just have to import the api.h file in your code, the include linking will work.
## Documentation for API Endpoints
All URIs are relative to *http://api.example.com/v1*
Category | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------
*DefaultAPI* | [**DefaultAPI_privateGet**](docs/DefaultAPI.md#DefaultAPI_privateGet) | **GET** /private | Returns private information.
*DefaultAPI* | [**DefaultAPI_publicGet**](docs/DefaultAPI.md#DefaultAPI_publicGet) | **GET** /public | Returns public information.
*DefaultAPI* | [**DefaultAPI_usersGet**](docs/DefaultAPI.md#DefaultAPI_usersGet) | **GET** /users | Returns a list of users.
## Documentation for Models
## Documentation for Authorization
Authentication schemes defined for the API:
### bearerAuth
- **Type**: HTTP Bearer Token authentication (JWT)
## Author

View File

@ -0,0 +1,204 @@
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "DefaultAPI.h"
#define MAX_NUMBER_LENGTH 16
#define MAX_BUFFER_LENGTH 4096
#define intToStr(dst, src) \
do {\
char dst[256];\
snprintf(dst, 256, "%ld", (long int)(src));\
}while(0)
// Returns private information.
//
// This endpoint requires global security settings.
//
object_t*
DefaultAPI_privateGet(apiClient_t *apiClient)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/private")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/private");
list_addElement(localVarHeaderType,"application/json"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"GET");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","A JSON object with private information");
//}
//nonprimitive not container
cJSON *DefaultAPIlocalVarJSON = cJSON_Parse(apiClient->dataReceived);
object_t *elementToReturn = object_parseFromJSON(DefaultAPIlocalVarJSON);
cJSON_Delete(DefaultAPIlocalVarJSON);
if(elementToReturn == NULL) {
// return 0;
}
//return type
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
return elementToReturn;
end:
free(localVarPath);
return NULL;
}
// Returns public information.
//
// This endpoint does not require authentication.
//
object_t*
DefaultAPI_publicGet(apiClient_t *apiClient)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/public")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/public");
list_addElement(localVarHeaderType,"application/json"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"GET");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","A JSON object with public information");
//}
//nonprimitive not container
cJSON *DefaultAPIlocalVarJSON = cJSON_Parse(apiClient->dataReceived);
object_t *elementToReturn = object_parseFromJSON(DefaultAPIlocalVarJSON);
cJSON_Delete(DefaultAPIlocalVarJSON);
if(elementToReturn == NULL) {
// return 0;
}
//return type
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
return elementToReturn;
end:
free(localVarPath);
return NULL;
}
// Returns a list of users.
//
// Optional extended description in CommonMark or HTML.
//
list_t*
DefaultAPI_usersGet(apiClient_t *apiClient)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/users")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/users");
list_addElement(localVarHeaderType,"application/json"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"GET");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","A JSON array of user names");
//}
//primitive return type not simple
cJSON *localVarJSON = cJSON_Parse(apiClient->dataReceived);
cJSON *VarJSON;
list_t *elementToReturn = list_createList();
cJSON_ArrayForEach(VarJSON, localVarJSON){
keyValuePair_t *keyPair = keyValuePair_create(strdup(VarJSON->string), cJSON_Print(VarJSON));
list_addElement(elementToReturn, keyPair);
}
cJSON_Delete(localVarJSON);
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
return elementToReturn;
end:
free(localVarPath);
return NULL;
}

View File

@ -0,0 +1,34 @@
#include <stdlib.h>
#include <stdio.h>
#include "../include/apiClient.h"
#include "../include/list.h"
#include "../external/cJSON.h"
#include "../include/keyValuePair.h"
#include "../include/binary.h"
#include "../model/object.h"
// Returns private information.
//
// This endpoint requires global security settings.
//
object_t*
DefaultAPI_privateGet(apiClient_t *apiClient);
// Returns public information.
//
// This endpoint does not require authentication.
//
object_t*
DefaultAPI_publicGet(apiClient_t *apiClient);
// Returns a list of users.
//
// Optional extended description in CommonMark or HTML.
//
list_t*
DefaultAPI_usersGet(apiClient_t *apiClient);

View File

@ -0,0 +1,104 @@
# DefaultAPI
All URIs are relative to *http://api.example.com/v1*
Method | HTTP request | Description
------------- | ------------- | -------------
[**DefaultAPI_privateGet**](DefaultAPI.md#DefaultAPI_privateGet) | **GET** /private | Returns private information.
[**DefaultAPI_publicGet**](DefaultAPI.md#DefaultAPI_publicGet) | **GET** /public | Returns public information.
[**DefaultAPI_usersGet**](DefaultAPI.md#DefaultAPI_usersGet) | **GET** /users | Returns a list of users.
# **DefaultAPI_privateGet**
```c
// Returns private information.
//
// This endpoint requires global security settings.
//
object_t* DefaultAPI_privateGet(apiClient_t *apiClient);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
### Return type
[object_t](object.md) *
### Authorization
[bearerAuth](../README.md#bearerAuth)
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **DefaultAPI_publicGet**
```c
// Returns public information.
//
// This endpoint does not require authentication.
//
object_t* DefaultAPI_publicGet(apiClient_t *apiClient);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
### Return type
[object_t](object.md) *
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **DefaultAPI_usersGet**
```c
// Returns a list of users.
//
// Optional extended description in CommonMark or HTML.
//
list_t* DefaultAPI_usersGet(apiClient_t *apiClient);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
### Return type
[list_t](char.md) *
### Authorization
[bearerAuth](../README.md#bearerAuth)
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,277 @@
/*
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef cJSON__h
#define cJSON__h
#ifdef __cplusplus
extern "C"
{
#endif
/* project version */
#define CJSON_VERSION_MAJOR 1
#define CJSON_VERSION_MINOR 7
#define CJSON_VERSION_PATCH 7
#include <stddef.h>
/* cJSON Types: */
#define cJSON_Invalid (0)
#define cJSON_False (1 << 0)
#define cJSON_True (1 << 1)
#define cJSON_NULL (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw (1 << 7) /* raw json */
#define cJSON_IsReference 256
#define cJSON_StringIsConst 512
/* The cJSON structure: */
typedef struct cJSON
{
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *next;
struct cJSON *prev;
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
struct cJSON *child;
/* The type of the item, as above. */
int type;
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
char *valuestring;
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
int valueint;
/* The item's number, if type==cJSON_Number */
double valuedouble;
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
char *string;
} cJSON;
typedef struct cJSON_Hooks
{
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;
typedef int cJSON_bool;
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
#define __WINDOWS__
#endif
#ifdef __WINDOWS__
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options:
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
For *nix builds that support visibility attribute, you can define similar behavior by
setting default visibility to hidden by adding
-fvisibility=hidden (for gcc)
or
-xldscope=hidden (for sun cc)
to CFLAGS
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
*/
/* export symbols by default, this is necessary for copy pasting the C and header file */
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
#define CJSON_EXPORT_SYMBOLS
#endif
#if defined(CJSON_HIDE_SYMBOLS)
#define CJSON_PUBLIC(type) type __stdcall
#elif defined(CJSON_EXPORT_SYMBOLS)
#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall
#elif defined(CJSON_IMPORT_SYMBOLS)
#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall
#endif
#else /* !WIN32 */
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
#else
#define CJSON_PUBLIC(type) type
#endif
#endif
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
* This is to prevent stack overflows. */
#ifndef CJSON_NESTING_LIMIT
#define CJSON_NESTING_LIMIT 1000
#endif
/* returns the version of cJSON as a string */
CJSON_PUBLIC(const char*) cJSON_Version(void);
/* Supply malloc, realloc and free functions to cJSON */
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
/* Render a cJSON entity to text for transfer/storage. */
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
/* Render a cJSON entity to text for transfer/storage without any formatting. */
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
/* Delete a cJSON entity and all subentities. */
CJSON_PUBLIC(void) cJSON_Delete(cJSON *c);
/* Returns the number of items in an array (or object). */
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
/* Get item "string" from object. Case insensitive. */
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
/* Check if the item is a string and return its valuestring */
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);
/* These functions check the type of an item */
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
/* These calls create a cJSON item of the appropriate type. */
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
/* raw json */
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
/* Create a string where valuestring references a string so
* it will not be freed by cJSON_Delete */
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
/* Create an object/array that only references it's elements so
* they will not be freed by cJSON_Delete */
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
/* These utilities create an Array of count items. */
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count);
/* Append item to the specified array/object. */
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
* writing to `item->string` */
CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
/* Remove/Detach items from Arrays/Objects. */
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
/* Update array items. */
CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
/* Duplicate a cJSON item */
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
need to be released. With recurse!=0, it will duplicate any children connected to the item.
The item->next and ->prev pointers are always zero on return from Duplicate. */
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
CJSON_PUBLIC(void) cJSON_Minify(char *json);
/* Helper functions for creating and adding items to an object at the same time.
* They return the added item or NULL on failure. */
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
/* helper for the cJSON_SetNumberValue macro */
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
/* Macro for iterating over an array or object */
#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
CJSON_PUBLIC(void) cJSON_free(void *object);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,19 @@
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,62 @@
#ifndef INCLUDE_API_CLIENT_H
#define INCLUDE_API_CLIENT_H
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <curl/curl.h>
#include "../include/list.h"
#include "../include/keyValuePair.h"
#include "../include/binary.h"
typedef struct sslConfig_t {
char *clientCertFile; /* client certificate */
char *clientKeyFile; /* client private key */
char *CACertFile; /* CA certificate */
int insecureSkipTlsVerify ; /* 0 -- verify server certificate */
/* 1 -- skip ssl verify for server certificate */
} sslConfig_t;
typedef struct apiClient_t {
char *basePath;
sslConfig_t *sslConfig;
void *dataReceived;
long dataReceivedLen;
void (*data_callback_func)(void **, long *);
int (*progress_func)(void *, curl_off_t, curl_off_t, curl_off_t, curl_off_t);
void *progress_data;
long response_code;
char *accessToken;
} apiClient_t;
apiClient_t* apiClient_create();
apiClient_t* apiClient_create_with_base_path(const char *basePath
, sslConfig_t *sslConfig
);
void apiClient_free(apiClient_t *apiClient);
void apiClient_invoke(apiClient_t *apiClient,const char* operationParameter, list_t *queryParameters, list_t *headerParameters, list_t *formParameters,list_t *headerType,list_t *contentType, const char *bodyParameters, const char *requestType);
sslConfig_t *sslConfig_create(const char *clientCertFile, const char *clientKeyFile, const char *CACertFile, int insecureSkipTlsVerify);
void sslConfig_free(sslConfig_t *sslConfig);
char *strReplace(char *orig, char *rep, char *with);
/*
* In single thread program, the function apiClient_setupGlobalEnv is not needed.
* But in multi-thread program, apiClient_setupGlobalEnv must be called before any worker thread is created
*/
void apiClient_setupGlobalEnv();
/*
* This function apiClient_unsetupGlobalEnv must be called whether single or multiple program.
* In multi-thread program, it is must be called after all worker threads end.
*/
void apiClient_unsetupGlobalEnv();
#endif // INCLUDE_API_CLIENT_H

View File

@ -0,0 +1,18 @@
#ifndef INCLUDE_BINARY_H
#define INCLUDE_BINARY_H
#include <stdint.h>
typedef struct binary_t
{
uint8_t* data;
unsigned int len;
} binary_t;
binary_t* instantiate_binary_t(char* data, int len);
char *base64encode(const void *b64_encode_this, int encode_this_many_bytes);
char *base64decode(const void *b64_decode_this, int decode_this_many_bytes, int *decoded_bytes);
#endif // INCLUDE_BINARY_H

View File

@ -0,0 +1,17 @@
#ifndef _keyValuePair_H_
#define _keyValuePair_H_
#include<string.h>
typedef struct keyValuePair_t {
char* key;
void* value;
} keyValuePair_t;
keyValuePair_t *keyValuePair_create(char *key, void *value);
keyValuePair_t* keyValuePair_create_allocate(char* key, double value);
void keyValuePair_free(keyValuePair_t *keyValuePair);
#endif /* _keyValuePair_H_ */

View File

@ -0,0 +1,42 @@
#ifndef INCLUDE_LIST_H
#define INCLUDE_LIST_H
#include "../external/cJSON.h"
#include "../include/list.h"
typedef struct list_t list_t;
typedef struct listEntry_t listEntry_t;
struct listEntry_t {
listEntry_t* nextListEntry;
listEntry_t* prevListEntry;
void* data;
};
typedef struct list_t {
listEntry_t *firstEntry;
listEntry_t *lastEntry;
long count;
} list_t;
#define list_ForEach(element, list) for(element = (list != NULL) ? (list)->firstEntry : NULL; element != NULL; element = element->nextListEntry)
list_t* list_createList();
void list_freeList(list_t* listToFree);
void list_addElement(list_t* list, void* dataToAddInList);
listEntry_t* list_getElementAt(list_t *list, long indexOfElement);
listEntry_t* list_getWithIndex(list_t* list, int index);
void list_removeElement(list_t* list, listEntry_t* elementToRemove);
void list_iterateThroughListForward(list_t* list, void (*operationToPerform)(listEntry_t*, void*), void *additionalDataNeededForCallbackFunction);
void list_iterateThroughListBackward(list_t* list, void (*operationToPerform)(listEntry_t*, void*), void *additionalDataNeededForCallbackFunction);
void listEntry_printAsInt(listEntry_t* listEntry, void *additionalData);
void listEntry_free(listEntry_t *listEntry, void *additionalData);
char* findStrInStrList(list_t* strList, const char* str);
void clear_and_free_string_list(list_t * list);
#endif // INCLUDE_LIST_H

View File

@ -0,0 +1,11 @@
COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1996 - 2018, Daniel Stenberg, daniel@haxx.se, and many contributors, see the THANKS file.
All rights reserved.
Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.

View File

@ -0,0 +1,5 @@
/*
* any_type.h
*
* A placeholder for now, this type isn't really needed.
*/

View File

@ -0,0 +1,51 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "object.h"
object_t *object_create() {
object_t *object = calloc(1, sizeof(object_t));
return object;
}
void object_free(object_t *object) {
if (!object) {
return ;
}
if (object->temporary) {
free(object->temporary);
object->temporary = NULL;
}
free (object);
}
cJSON *object_convertToJSON(object_t *object) {
if (!object) {
return NULL;
}
if (!object->temporary) {
return cJSON_Parse("null");
}
return cJSON_Parse(object->temporary);
}
object_t *object_parseFromJSON(cJSON *json){
if (!json) {
goto end;
}
object_t *object = object_create();
if (!object) {
goto end;
}
object->temporary = cJSON_Print(json);
return object;
end:
return NULL;
}

View File

@ -0,0 +1,27 @@
/*
* object.h
*/
#ifndef _object_H_
#define _object_H_
#include <string.h>
#include "../external/cJSON.h"
#include "../include/list.h"
#include "../include/keyValuePair.h"
#include "../include/binary.h"
typedef struct object_t {
void *temporary;
} object_t;
object_t *object_create();
void object_free(object_t *object);
object_t *object_parseFromJSON(cJSON *json);
cJSON *object_convertToJSON(object_t *object);
#endif /* _object_H_ */

View File

@ -0,0 +1,509 @@
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "../include/apiClient.h"
size_t writeDataCallback(void *buffer, size_t size, size_t nmemb, void *userp);
apiClient_t *apiClient_create() {
apiClient_t *apiClient = malloc(sizeof(apiClient_t));
apiClient->basePath = strdup("http://api.example.com/v1");
apiClient->sslConfig = NULL;
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
apiClient->data_callback_func = NULL;
apiClient->progress_func = NULL;
apiClient->progress_data = NULL;
apiClient->response_code = 0;
apiClient->accessToken = NULL;
return apiClient;
}
apiClient_t *apiClient_create_with_base_path(const char *basePath
, sslConfig_t *sslConfig
) {
apiClient_t *apiClient = malloc(sizeof(apiClient_t));
if(basePath){
apiClient->basePath = strdup(basePath);
}else{
apiClient->basePath = strdup("http://api.example.com/v1");
}
if(sslConfig){
apiClient->sslConfig = sslConfig;
}else{
apiClient->sslConfig = NULL;
}
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
apiClient->data_callback_func = NULL;
apiClient->progress_func = NULL;
apiClient->progress_data = NULL;
apiClient->response_code = 0;
apiClient->accessToken = NULL;
return apiClient;
}
void apiClient_free(apiClient_t *apiClient) {
if(apiClient->basePath) {
free(apiClient->basePath);
}
apiClient->data_callback_func = NULL;
apiClient->progress_func = NULL;
apiClient->progress_data = NULL;
if(apiClient->accessToken) {
free(apiClient->accessToken);
}
free(apiClient);
}
sslConfig_t *sslConfig_create(const char *clientCertFile, const char *clientKeyFile, const char *CACertFile, int insecureSkipTlsVerify) {
sslConfig_t *sslConfig = calloc(1, sizeof(sslConfig_t));
if ( clientCertFile ) {
sslConfig->clientCertFile = strdup(clientCertFile);
}
if ( clientKeyFile ) {
sslConfig->clientKeyFile = strdup(clientKeyFile);
}
if ( CACertFile ) {
sslConfig->CACertFile = strdup(CACertFile);
}
sslConfig->insecureSkipTlsVerify = insecureSkipTlsVerify;
return sslConfig;
}
void sslConfig_free(sslConfig_t *sslConfig) {
if ( sslConfig->clientCertFile ) {
free(sslConfig->clientCertFile);
}
if ( sslConfig->clientKeyFile ) {
free(sslConfig->clientKeyFile);
}
if ( sslConfig->CACertFile ){
free(sslConfig->CACertFile);
}
free(sslConfig);
}
void replaceSpaceWithPlus(char *stringToProcess) {
for(int i = 0; i < strlen(stringToProcess); i++) {
if(stringToProcess[i] == ' ') {
stringToProcess[i] = '+';
}
}
}
char *assembleTargetUrl(const char *basePath,
const char *operationParameter,
list_t *queryParameters) {
int neededBufferSizeForQueryParameters = 0;
listEntry_t *listEntry;
if(queryParameters != NULL) {
list_ForEach(listEntry, queryParameters) {
keyValuePair_t *pair = listEntry->data;
neededBufferSizeForQueryParameters +=
strlen(pair->key) + strlen(pair->value);
}
neededBufferSizeForQueryParameters +=
(queryParameters->count * 2); // each keyValuePair is separated by a = and a & except the last, but this makes up for the ? at the beginning
}
int operationParameterLength = 0;
int basePathLength = strlen(basePath);
if(operationParameter != NULL) {
operationParameterLength = (1 + strlen(operationParameter));
}
char *targetUrl =
malloc(
neededBufferSizeForQueryParameters + basePathLength + operationParameterLength +
1);
strcpy(targetUrl, basePath);
if(operationParameter != NULL) {
strcat(targetUrl, operationParameter);
}
if(queryParameters != NULL) {
strcat(targetUrl, "?");
list_ForEach(listEntry, queryParameters) {
keyValuePair_t *pair = listEntry->data;
replaceSpaceWithPlus(pair->key);
strcat(targetUrl, pair->key);
strcat(targetUrl, "=");
replaceSpaceWithPlus(pair->value);
strcat(targetUrl, pair->value);
if(listEntry->nextListEntry != NULL) {
strcat(targetUrl, "&");
}
}
}
return targetUrl;
}
char *assembleHeaderField(char *key, char *value) {
char *header = malloc(strlen(key) + strlen(value) + 3);
strcpy(header, key),
strcat(header, ": ");
strcat(header, value);
return header;
}
void postData(CURL *handle, const char *bodyParameters) {
curl_easy_setopt(handle, CURLOPT_POSTFIELDS, bodyParameters);
curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE_LARGE,
(curl_off_t)strlen(bodyParameters));
}
int lengthOfKeyPair(keyValuePair_t *keyPair) {
long length = 0;
if((keyPair->key != NULL) &&
(keyPair->value != NULL) )
{
length = strlen(keyPair->key) + strlen(keyPair->value);
return length;
}
return 0;
}
void apiClient_invoke(apiClient_t *apiClient,
const char *operationParameter,
list_t *queryParameters,
list_t *headerParameters,
list_t *formParameters,
list_t *headerType,
list_t *contentType,
const char *bodyParameters,
const char *requestType) {
CURL *handle = curl_easy_init();
CURLcode res;
if(handle) {
listEntry_t *listEntry;
curl_mime *mime = NULL;
struct curl_slist *headers = NULL;
char *buffContent = NULL;
char *buffHeader = NULL;
binary_t *fileVar = NULL;
char *formString = NULL;
if(headerType != NULL) {
list_ForEach(listEntry, headerType) {
if(strstr((char *) listEntry->data,
"xml") == NULL)
{
buffHeader = malloc(strlen(
"Accept: ") +
strlen((char *)
listEntry->
data) + 1);
sprintf(buffHeader, "%s%s", "Accept: ",
(char *) listEntry->data);
headers = curl_slist_append(headers,
buffHeader);
free(buffHeader);
}
}
}
if(contentType != NULL) {
list_ForEach(listEntry, contentType) {
if(strstr((char *) listEntry->data,
"xml") == NULL)
{
buffContent =
malloc(strlen(
"Content-Type: ") + strlen(
(char *)
listEntry->data) +
1);
sprintf(buffContent, "%s%s",
"Content-Type: ",
(char *) listEntry->data);
headers = curl_slist_append(headers,
buffContent);
free(buffContent);
buffContent = NULL;
}
}
} else {
headers = curl_slist_append(headers,
"Content-Type: application/json");
}
if(requestType != NULL) {
curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST,
requestType);
}
if(formParameters != NULL) {
if(contentType &&
findStrInStrList(contentType, "application/x-www-form-urlencoded") != NULL)
{
long parameterLength = 0;
long keyPairLength = 0;
list_ForEach(listEntry, formParameters) {
keyValuePair_t *keyPair =
listEntry->data;
keyPairLength =
lengthOfKeyPair(keyPair) + 1;
if(listEntry->nextListEntry != NULL) {
parameterLength++;
}
parameterLength = parameterLength +
keyPairLength;
}
formString = malloc(parameterLength + 1);
memset(formString, 0, parameterLength + 1);
list_ForEach(listEntry, formParameters) {
keyValuePair_t *keyPair =
listEntry->data;
if((keyPair->key != NULL) &&
(keyPair->value != NULL) )
{
strcat(formString,
keyPair->key);
strcat(formString, "=");
strcat(formString,
keyPair->value);
if(listEntry->nextListEntry !=
NULL)
{
strcat(formString, "&");
}
}
}
curl_easy_setopt(handle, CURLOPT_POSTFIELDS,
formString);
}
if(contentType &&
findStrInStrList(contentType, "multipart/form-data") != NULL) {
mime = curl_mime_init(handle);
list_ForEach(listEntry, formParameters) {
keyValuePair_t *keyValuePair =
listEntry->data;
if((keyValuePair->key != NULL) &&
(keyValuePair->value != NULL) )
{
curl_mimepart *part =
curl_mime_addpart(mime);
curl_mime_name(part,
keyValuePair->key);
if(strcmp(keyValuePair->key,
"file") == 0)
{
memcpy(&fileVar,
keyValuePair->value,
sizeof(fileVar));
curl_mime_data(part,
fileVar->data,
fileVar->len);
curl_mime_filename(part,
"image.png");
} else {
curl_mime_data(part,
keyValuePair->value,
CURL_ZERO_TERMINATED);
}
}
}
curl_easy_setopt(handle, CURLOPT_MIMEPOST,
mime);
}
}
list_ForEach(listEntry, headerParameters) {
keyValuePair_t *keyValuePair = listEntry->data;
if((keyValuePair->key != NULL) &&
(keyValuePair->value != NULL) )
{
char *headerValueToWrite = assembleHeaderField(
keyValuePair->key, keyValuePair->value);
curl_slist_append(headers, headerValueToWrite);
free(headerValueToWrite);
}
}
if ( strstr(apiClient->basePath, "https") != NULL ) {
if ( apiClient->sslConfig ) {
if( apiClient->sslConfig->clientCertFile ) {
curl_easy_setopt(handle, CURLOPT_SSLCERT, apiClient->sslConfig->clientCertFile);
}
if( apiClient->sslConfig->clientKeyFile ) {
curl_easy_setopt(handle, CURLOPT_SSLKEY, apiClient->sslConfig->clientKeyFile);
}
if( apiClient->sslConfig->CACertFile ) {
curl_easy_setopt(handle, CURLOPT_CAINFO, apiClient->sslConfig->CACertFile);
}
if ( 1 == apiClient->sslConfig->insecureSkipTlsVerify ) {
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L);
} else {
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 2L);
}
} else {
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L);
}
}
if (apiClient->progress_func != NULL) {
curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION, apiClient->progress_func);
if (apiClient->progress_data != NULL) {
curl_easy_setopt(handle, CURLOPT_XFERINFODATA, apiClient->progress_data);
}
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0L);
}
// this would only be generated for bearer token authentication
if(apiClient->accessToken != NULL)
{
int authHeaderSize;
char *authHeader = NULL;
authHeaderSize = snprintf(NULL, 0, "Authorization: Bearer %s", apiClient->accessToken) + 1;
authHeader = malloc(authHeaderSize);
snprintf(authHeader, authHeaderSize, "Authorization: Bearer %s", apiClient->accessToken);
headers = curl_slist_append(headers, authHeader);
free(authHeader);
}
char *targetUrl =
assembleTargetUrl(apiClient->basePath,
operationParameter,
queryParameters);
curl_easy_setopt(handle, CURLOPT_URL, targetUrl);
curl_easy_setopt(handle,
CURLOPT_WRITEFUNCTION,
writeDataCallback);
curl_easy_setopt(handle,
CURLOPT_WRITEDATA,
apiClient);
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(handle, CURLOPT_VERBOSE, 0); // to get curl debug msg 0: to disable, 1L:to enable
if(bodyParameters != NULL) {
postData(handle, bodyParameters);
}
res = curl_easy_perform(handle);
curl_slist_free_all(headers);
free(targetUrl);
if(res == CURLE_OK) {
curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &apiClient->response_code);
} else {
char *url,*ip,*scheme;
long port;
curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
curl_easy_getinfo(handle, CURLINFO_PRIMARY_IP, &ip);
curl_easy_getinfo(handle, CURLINFO_PRIMARY_PORT, &port);
curl_easy_getinfo(handle, CURLINFO_SCHEME, &scheme);
fprintf(stderr, "curl_easy_perform() failed\n\nURL: %s\nIP: %s\nPORT: %li\nSCHEME: %s\nStrERROR: %s\n",url,ip,port,scheme,
curl_easy_strerror(res));
}
curl_easy_cleanup(handle);
if(formParameters != NULL) {
free(formString);
curl_mime_free(mime);
}
}
}
size_t writeDataCallback(void *buffer, size_t size, size_t nmemb, void *userp) {
size_t size_this_time = nmemb * size;
apiClient_t *apiClient = (apiClient_t *)userp;
apiClient->dataReceived = (char *)realloc( apiClient->dataReceived, apiClient->dataReceivedLen + size_this_time + 1);
memcpy((char *)apiClient->dataReceived + apiClient->dataReceivedLen, buffer, size_this_time);
apiClient->dataReceivedLen += size_this_time;
((char*)apiClient->dataReceived)[apiClient->dataReceivedLen] = '\0'; // the space size of (apiClient->dataReceived) = dataReceivedLen + 1
if (apiClient->data_callback_func) {
apiClient->data_callback_func(&apiClient->dataReceived, &apiClient->dataReceivedLen);
}
return size_this_time;
}
char *strReplace(char *orig, char *rep, char *with) {
char *result; // the return string
char *ins; // the next insert point
char *tmp; // varies
int lenRep; // length of rep (the string to remove)
int lenWith; // length of with (the string to replace rep with)
int lenFront; // distance between rep and end of last rep
int count; // number of replacements
// sanity checks and initialization
if(!orig || !rep)
{
return NULL;
}
lenRep = strlen(rep);
if(lenRep == 0) {
return NULL; // empty rep causes infinite loop during count
}
if(!with) {
with = "";
}
lenWith = strlen(with);
// count the number of replacements needed
ins = orig;
for(count = 0; tmp = strstr(ins, rep); ++count) {
ins = tmp + lenRep;
}
tmp = result = malloc(strlen(orig) + (lenWith - lenRep) * count + 1);
if(!result) {
return NULL;
}
char *originalPointer = orig; // copying original pointer to free the memory
// first time through the loop, all the variable are set correctly
// from here on,
// tmp points to the end of the result string
// ins points to the next occurrence of rep in orig
// orig points to the remainder of orig after "end of rep"
while(count--) {
ins = strstr(orig, rep);
lenFront = ins - orig;
tmp = strncpy(tmp, orig, lenFront) + lenFront;
tmp = strcpy(tmp, with) + lenWith;
orig += lenFront + lenRep; // move to next "end of rep"
}
strcpy(tmp, orig);
free(originalPointer);
return result;
}
void apiClient_setupGlobalEnv() {
curl_global_init(CURL_GLOBAL_ALL);
}
void apiClient_unsetupGlobalEnv() {
curl_global_cleanup();
}

View File

@ -0,0 +1,20 @@
#include <stdlib.h>
#include <string.h>
#include "../include/keyValuePair.h"
keyValuePair_t *keyValuePair_create(char *key, void *value) {
keyValuePair_t *keyValuePair = malloc(sizeof(keyValuePair_t));
keyValuePair->key = key;
keyValuePair->value = value;
return keyValuePair;
}
keyValuePair_t* keyValuePair_create_allocate(char* key, double value) {
double* boolpointer = malloc(sizeof(value));
memcpy(boolpointer, &value, sizeof(value));
return keyValuePair_create(key, boolpointer);
}
void keyValuePair_free(keyValuePair_t *keyValuePair) {
free(keyValuePair);
}

View File

@ -0,0 +1,58 @@
#include <stdlib.h>
#include <string.h>
#include "../include/binary.h"
#ifdef OPENSSL
#include "openssl/pem.h"
#endif
binary_t* instantiate_binary_t(char* data, int len) {
binary_t* ret = malloc(sizeof(struct binary_t));
ret->len=len;
ret->data = malloc(len);
memcpy(ret->data, data, len);
return ret;
}
char *base64encode (const void *b64_encode_this, int encode_this_many_bytes){
#ifdef OPENSSL
BIO *b64_bio, *mem_bio; //Declares two OpenSSL BIOs: a base64 filter and a memory BIO.
BUF_MEM *mem_bio_mem_ptr; //Pointer to a "memory BIO" structure holding our base64 data.
b64_bio = BIO_new(BIO_f_base64()); //Initialize our base64 filter BIO.
mem_bio = BIO_new(BIO_s_mem()); //Initialize our memory sink BIO.
BIO_push(b64_bio, mem_bio); //Link the BIOs by creating a filter-sink BIO chain.
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL); //No newlines every 64 characters or less.
BIO_write(b64_bio, b64_encode_this, encode_this_many_bytes); //Records base64 encoded data.
BIO_flush(b64_bio); //Flush data. Necessary for b64 encoding, because of pad characters.
BIO_get_mem_ptr(mem_bio, &mem_bio_mem_ptr); //Store address of mem_bio's memory structure.
BIO_set_close(mem_bio, BIO_NOCLOSE); //Permit access to mem_ptr after BIOs are destroyed.
BIO_free_all(b64_bio); //Destroys all BIOs in chain, starting with b64 (i.e. the 1st one).
BUF_MEM_grow(mem_bio_mem_ptr, (*mem_bio_mem_ptr).length + 1); //Makes space for end null.
(*mem_bio_mem_ptr).data[(*mem_bio_mem_ptr).length] = '\0'; //Adds null-terminator to tail.
return (*mem_bio_mem_ptr).data; //Returns base-64 encoded data. (See: "buf_mem_st" struct).
#else // OPENSSL
#warning Data will not be encoded. If you want to use function "base64encode", please define "-DOPENSSL" when building the library.
return NULL;
#endif // OPENSSL
}
char *base64decode (const void *b64_decode_this, int decode_this_many_bytes, int *decoded_bytes){
#ifdef OPENSSL
BIO *b64_bio, *mem_bio; //Declares two OpenSSL BIOs: a base64 filter and a memory BIO.
char *base64_decoded = calloc( (decode_this_many_bytes*3)/4+1, sizeof(char) ); //+1 = null.
b64_bio = BIO_new(BIO_f_base64()); //Initialize our base64 filter BIO.
mem_bio = BIO_new(BIO_s_mem()); //Initialize our memory source BIO.
BIO_write(mem_bio, b64_decode_this, decode_this_many_bytes); //Base64 data saved in source.
BIO_push(b64_bio, mem_bio); //Link the BIOs by creating a filter-source BIO chain.
BIO_set_flags(b64_bio, BIO_FLAGS_BASE64_NO_NL); //Don't require trailing newlines.
int decoded_byte_index = 0; //Index where the next base64_decoded byte should be written.
while ( 0 < BIO_read(b64_bio, base64_decoded+decoded_byte_index, 1) ){ //Read byte-by-byte.
decoded_byte_index++; //Increment the index until read of BIO decoded data is complete.
} //Once we're done reading decoded data, BIO_read returns -1 even though there's no error.
BIO_free_all(b64_bio); //Destroys all BIOs in chain, starting with b64 (i.e. the 1st one).
*decoded_bytes = decoded_byte_index;
return base64_decoded; //Returns base-64 decoded data with trailing null terminator.
#else // OPENSSL
#warning Data will not be decoded. If you want to use function "base64decode", please define "-DOPENSSL" when building the library.
return NULL;
#endif // OPENSSL
}

View File

@ -0,0 +1,200 @@
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../include/list.h"
static listEntry_t *listEntry_create(void *data) {
listEntry_t *createdListEntry = malloc(sizeof(listEntry_t));
if(createdListEntry == NULL) {
// TODO Malloc Failure
return NULL;
}
createdListEntry->data = data;
return createdListEntry;
}
void listEntry_free(listEntry_t *listEntry, void *additionalData) {
free(listEntry);
}
void listEntry_printAsInt(listEntry_t *listEntry, void *additionalData) {
printf("%i\n", *((int *) (listEntry->data)));
}
list_t *list_createList() {
list_t *createdList = malloc(sizeof(list_t));
if(createdList == NULL) {
// TODO Malloc Failure
return NULL;
}
createdList->firstEntry = NULL;
createdList->lastEntry = NULL;
createdList->count = 0;
return createdList;
}
void list_iterateThroughListForward(list_t *list,
void (*operationToPerform)(
listEntry_t *,
void *callbackFunctionUsedData),
void *additionalDataNeededForCallbackFunction)
{
listEntry_t *currentListEntry = list->firstEntry;
listEntry_t *nextListEntry;
if(currentListEntry == NULL) {
return;
}
nextListEntry = currentListEntry->nextListEntry;
operationToPerform(currentListEntry,
additionalDataNeededForCallbackFunction);
currentListEntry = nextListEntry;
while(currentListEntry != NULL) {
nextListEntry = currentListEntry->nextListEntry;
operationToPerform(currentListEntry,
additionalDataNeededForCallbackFunction);
currentListEntry = nextListEntry;
}
}
void list_iterateThroughListBackward(list_t *list,
void (*operationToPerform)(
listEntry_t *,
void *callbackFunctionUsedData),
void *additionalDataNeededForCallbackFunction)
{
listEntry_t *currentListEntry = list->lastEntry;
listEntry_t *nextListEntry = currentListEntry->prevListEntry;
if(currentListEntry == NULL) {
return;
}
operationToPerform(currentListEntry,
additionalDataNeededForCallbackFunction);
currentListEntry = nextListEntry;
while(currentListEntry != NULL) {
nextListEntry = currentListEntry->prevListEntry;
operationToPerform(currentListEntry,
additionalDataNeededForCallbackFunction);
currentListEntry = nextListEntry;
}
}
void list_freeList(list_t *list) {
if(list){
list_iterateThroughListForward(list, listEntry_free, NULL);
free(list);
}
}
void list_addElement(list_t *list, void *dataToAddInList) {
listEntry_t *newListEntry = listEntry_create(dataToAddInList);
if(newListEntry == NULL) {
// TODO Malloc Failure
return;
}
if(list->firstEntry == NULL) {
list->firstEntry = newListEntry;
list->lastEntry = newListEntry;
newListEntry->prevListEntry = NULL;
newListEntry->nextListEntry = NULL;
list->count++;
return;
}
list->lastEntry->nextListEntry = newListEntry;
newListEntry->prevListEntry = list->lastEntry;
newListEntry->nextListEntry = NULL;
list->lastEntry = newListEntry;
list->count++;
}
void list_removeElement(list_t *list, listEntry_t *elementToRemove) {
listEntry_t *elementBeforeElementToRemove =
elementToRemove->prevListEntry;
listEntry_t *elementAfterElementToRemove =
elementToRemove->nextListEntry;
if(elementBeforeElementToRemove != NULL) {
elementBeforeElementToRemove->nextListEntry =
elementAfterElementToRemove;
} else {
list->firstEntry = elementAfterElementToRemove;
}
if(elementAfterElementToRemove != NULL) {
elementAfterElementToRemove->prevListEntry =
elementBeforeElementToRemove;
} else {
list->lastEntry = elementBeforeElementToRemove;
}
listEntry_free(elementToRemove, NULL);
list->count--;
}
listEntry_t *list_getElementAt(list_t *list, long indexOfElement) {
listEntry_t *currentListEntry;
if((list->count / 2) > indexOfElement) {
currentListEntry = list->firstEntry;
for(int i = 0; i < indexOfElement; i++) {
currentListEntry = currentListEntry->nextListEntry;
}
return currentListEntry;
} else {
currentListEntry = list->lastEntry;
for(int i = 1; i < (list->count - indexOfElement); i++) {
currentListEntry = currentListEntry->prevListEntry;
}
return currentListEntry;
}
}
char* findStrInStrList(list_t *strList, const char *str)
{
if (!strList || !str) {
return NULL;
}
listEntry_t* listEntry = NULL;
list_ForEach(listEntry, strList) {
if (strstr((char*)listEntry->data, str) != NULL) {
return (char*)listEntry->data;
}
}
return NULL;
}
void clear_and_free_string_list(list_t *list)
{
if (!list) {
return;
}
listEntry_t *listEntry = NULL;
list_ForEach(listEntry, list) {
char *list_item = listEntry->data;
free(list_item);
list_item = NULL;
}
list_freeList(list);
}

View File

@ -0,0 +1,210 @@
tok_split_gte=false
utf8_byte=false
utf8_force=true
indent_cmt_with_tabs=false
indent_align_string=false
indent_braces=false
indent_braces_no_func=false
indent_braces_no_class=false
indent_braces_no_struct=false
indent_brace_parent=false
indent_namespace=false
indent_extern=true
indent_class=false
indent_class_colon=false
indent_else_if=false
indent_var_def_cont=false
indent_func_call_param=false
indent_func_def_param=false
indent_func_proto_param=false
indent_func_class_param=false
indent_func_ctor_var_param=false
indent_template_param=false
indent_func_param_double=false
indent_relative_single_line_comments=false
indent_col1_comment=false
indent_access_spec_body=false
indent_paren_nl=false
indent_comma_paren=false
indent_bool_paren=false
indent_first_bool_expr=false
indent_square_nl=false
indent_preserve_sql=false
indent_align_assign=true
sp_balance_nested_parens=false
align_keep_tabs=false
align_with_tabs=true
align_on_tabstop=true
align_func_params=true
align_same_func_call_params=false
align_var_def_colon=false
align_var_def_attribute=false
align_var_def_inline=false
align_right_cmt_mix=false
align_on_operator=false
align_mix_var_proto=false
align_single_line_func=false
align_single_line_brace=false
align_nl_cont=false
align_left_shift=true
align_oc_decl_colon=false
nl_collapse_empty_body=true
nl_assign_leave_one_liners=false
nl_class_leave_one_liners=false
nl_enum_leave_one_liners=false
nl_getset_leave_one_liners=false
nl_func_leave_one_liners=false
nl_if_leave_one_liners=false
nl_multi_line_cond=true
nl_multi_line_define=false
nl_before_case=true
nl_after_case=true
nl_after_return=false
nl_after_semicolon=true
nl_after_brace_open=false
nl_after_brace_open_cmt=false
nl_after_vbrace_open=false
nl_after_vbrace_open_empty=false
nl_after_brace_close=false
nl_after_vbrace_close=false
nl_define_macro=false
nl_squeeze_ifdef=false
nl_ds_struct_enum_cmt=false
nl_ds_struct_enum_close_brace=false
nl_create_if_one_liner=false
nl_create_for_one_liner=false
nl_create_while_one_liner=false
ls_for_split_full=false
ls_func_split_full=false
nl_after_multiline_comment=false
eat_blanks_after_open_brace=true
eat_blanks_before_close_brace=true
mod_full_brace_if_chain=false
mod_pawn_semicolon=false
mod_full_paren_if_bool=true
mod_remove_extra_semicolon=true
mod_sort_import=true
mod_sort_using=false
mod_sort_include=false
mod_move_case_break=false
mod_remove_empty_return=true
cmt_indent_multi=true
cmt_c_group=false
cmt_c_nl_start=true
cmt_c_nl_end=true
cmt_cpp_group=false
cmt_cpp_nl_start=true
cmt_cpp_nl_end=true
cmt_cpp_to_c=false
cmt_star_cont=false
cmt_multi_check_last=true
cmt_insert_before_preproc=false
pp_indent_at_level=false
pp_region_indent_code=false
pp_if_indent_code=false
pp_define_at_level=false
align_var_def_star_style=1
align_var_def_amp_style=0
code_width=80
indent_with_tabs=1
sp_arith=force
sp_assign=force
sp_assign_default=force
sp_enum_assign=force
sp_bool=force
sp_compare=force
sp_inside_paren=remove
sp_before_ptr_star=force
sp_before_unnamed_ptr_star=force
sp_between_ptr_star=remove
sp_after_ptr_star=remove
sp_before_sparen=remove
sp_inside_sparen=remove
sp_sparen_brace=force
sp_before_semi=remove
sp_before_semi_for_empty=force
sp_after_semi=force
sp_after_semi_for=force
sp_after_semi_for_empty=force
sp_before_square=remove
sp_before_squares=remove
sp_inside_square=remove
sp_after_comma=force
sp_before_comma=remove
sp_paren_comma=force
sp_before_case_colon=remove
sp_after_cast=force
sp_inside_paren_cast=remove
sp_sizeof_paren=remove
sp_inside_braces_struct=force
sp_type_func=remove
sp_func_proto_paren=remove
sp_func_def_paren=remove
sp_inside_fparens=remove
sp_inside_fparen=remove
sp_square_fparen=remove
sp_fparen_brace=force
sp_func_call_paren=remove
sp_attribute_paren=remove
sp_defined_paren=remove
sp_macro=force
sp_macro_func=force
sp_else_brace=force
sp_brace_else=force
sp_brace_typedef=force
sp_not=remove
sp_inv=remove
sp_addr=remove
sp_member=remove
sp_deref=remove
sp_sign=remove
sp_incdec=remove
sp_before_nl_cont=force
sp_cond_colon=force
sp_cond_question=force
sp_case_label=force
sp_cmt_cpp_start=force
sp_endif_cmt=force
sp_before_tr_emb_cmt=force
nl_start_of_file=remove
nl_end_of_file=add
nl_assign_brace=remove
nl_enum_brace=remove
nl_struct_brace=remove
nl_union_brace=remove
nl_if_brace=remove
nl_brace_else=remove
nl_elseif_brace=remove
nl_else_brace=remove
nl_else_if=remove
nl_brace_finally=remove
nl_finally_brace=remove
nl_try_brace=remove
nl_for_brace=remove
nl_catch_brace=remove
nl_brace_catch=remove
nl_while_brace=remove
nl_do_brace=remove
nl_brace_while=remove
nl_switch_brace=remove
nl_class_brace=remove
nl_func_type_name=remove
nl_func_proto_type_name=remove
nl_func_paren=remove
nl_func_def_paren=remove
nl_func_decl_start=remove
nl_func_def_start=remove
nl_func_decl_args=remove
nl_func_def_args=remove
nl_func_decl_end=remove
nl_func_def_end=remove
nl_func_decl_empty=remove
nl_func_def_empty=remove
nl_fdef_brace=remove
nl_return_expr=remove
pos_bool=trail_break
mod_full_brace_do=force
mod_full_brace_for=force
mod_full_brace_if=force
mod_full_brace_while=force
mod_paren_on_return=remove

View File

@ -12,6 +12,7 @@ docs/PetAPI.md
docs/StoreAPI.md docs/StoreAPI.md
docs/UserAPI.md docs/UserAPI.md
docs/api_response.md docs/api_response.md
docs/bit.md
docs/category.md docs/category.md
docs/model_with_set_propertes.md docs/model_with_set_propertes.md
docs/order.md docs/order.md
@ -30,6 +31,8 @@ libcurl.licence
model/any_type.h model/any_type.h
model/api_response.c model/api_response.c
model/api_response.h model/api_response.h
model/bit.c
model/bit.h
model/category.c model/category.c
model/category.h model/category.h
model/mapped_model.c model/mapped_model.c

View File

@ -56,6 +56,7 @@ set(SRCS
model/object.c model/object.c
model/mapped_model.c model/mapped_model.c
model/api_response.c model/api_response.c
model/bit.c
model/category.c model/category.c
model/model_with_set_propertes.c model/model_with_set_propertes.c
model/order.c model/order.c
@ -79,6 +80,7 @@ set(HDRS
model/any_type.h model/any_type.h
model/mapped_model.h model/mapped_model.h
model/api_response.h model/api_response.h
model/bit.h
model/category.h model/category.h
model/model_with_set_propertes.h model/model_with_set_propertes.h
model/order.h model/order.h

View File

@ -70,6 +70,8 @@ Category | Method | HTTP request | Description
*PetAPI* | [**PetAPI_findPetsByStatus**](docs/PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status *PetAPI* | [**PetAPI_findPetsByStatus**](docs/PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status
*PetAPI* | [**PetAPI_findPetsByTags**](docs/PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags *PetAPI* | [**PetAPI_findPetsByTags**](docs/PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags
*PetAPI* | [**PetAPI_getPetById**](docs/PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID *PetAPI* | [**PetAPI_getPetById**](docs/PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID
*PetAPI* | [**PetAPI_isPetAvailable**](docs/PetAPI.md#PetAPI_isPetAvailable) | **POST** /pet/{petId}/isAvailable | Is this pet still available?
*PetAPI* | [**PetAPI_sharePicture**](docs/PetAPI.md#PetAPI_sharePicture) | **POST** /pet/picture | Send a picture of your happy pet
*PetAPI* | [**PetAPI_specialtyPet**](docs/PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop *PetAPI* | [**PetAPI_specialtyPet**](docs/PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop
*PetAPI* | [**PetAPI_updatePet**](docs/PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet *PetAPI* | [**PetAPI_updatePet**](docs/PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet
*PetAPI* | [**PetAPI_updatePetWithForm**](docs/PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data *PetAPI* | [**PetAPI_updatePetWithForm**](docs/PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data
@ -93,6 +95,7 @@ Category | Method | HTTP request | Description
- [MappedModel_t](docs/MappedModel.md) - [MappedModel_t](docs/MappedModel.md)
- [api_response_t](docs/api_response.md) - [api_response_t](docs/api_response.md)
- [bit_t](docs/bit.md)
- [category_t](docs/category.md) - [category_t](docs/category.md)
- [model_with_set_propertes_t](docs/model_with_set_propertes.md) - [model_with_set_propertes_t](docs/model_with_set_propertes.md)
- [order_t](docs/order.md) - [order_t](docs/order.md)

View File

@ -460,6 +460,141 @@ end:
} }
// Is this pet still available?
//
openapi_petstore_bit__e
PetAPI_isPetAvailable(apiClient_t *apiClient, long petId)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/pet/{petId}/isAvailable")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/pet/{petId}/isAvailable");
// Path Params
long sizeOfPathParams_petId = sizeof(petId)+3 + strlen("{ petId }");
if(petId == 0){
goto end;
}
char* localVarToReplace_petId = malloc(sizeOfPathParams_petId);
snprintf(localVarToReplace_petId, sizeOfPathParams_petId, "{%s}", "petId");
char localVarBuff_petId[256];
intToStr(localVarBuff_petId, petId);
localVarPath = strReplace(localVarPath, localVarToReplace_petId, localVarBuff_petId);
list_addElement(localVarHeaderType,"application/json"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"POST");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","successful operation");
//}
//nonprimitive not container
cJSON *PetAPIlocalVarJSON = cJSON_Parse(apiClient->dataReceived);
openapi_petstore_bit__e elementToReturn = bit_parseFromJSON(PetAPIlocalVarJSON);
cJSON_Delete(PetAPIlocalVarJSON);
if(elementToReturn == 0) {
// return 0;
}
//return type
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
free(localVarToReplace_petId);
return elementToReturn;
end:
free(localVarPath);
return 0;
}
// Send a picture of your happy pet
//
char*
PetAPI_sharePicture(apiClient_t *apiClient, char *picture)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/pet/picture")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/pet/picture");
// Body Param
localVarBodyParameters = strdup(picture);
list_addElement(localVarHeaderType,"*/*"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"POST");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","successful operation");
//}
//primitive return type simple
char* elementToReturn = strdup((char*)apiClient->dataReceived);
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
free(localVarBodyParameters);
return elementToReturn;
end:
free(localVarPath);
return NULL;
}
// Specialty of the shop // Specialty of the shop
// //
// Returns the kind of pet the store specializes in // Returns the kind of pet the store specializes in

View File

@ -6,6 +6,7 @@
#include "../include/keyValuePair.h" #include "../include/keyValuePair.h"
#include "../include/binary.h" #include "../include/binary.h"
#include "../model/api_response.h" #include "../model/api_response.h"
#include "../model/bit.h"
#include "../model/pet.h" #include "../model/pet.h"
#include "../model/preference.h" #include "../model/preference.h"
@ -49,6 +50,18 @@ pet_t*
PetAPI_getPetById(apiClient_t *apiClient, long petId); PetAPI_getPetById(apiClient_t *apiClient, long petId);
// Is this pet still available?
//
openapi_petstore_bit__e
PetAPI_isPetAvailable(apiClient_t *apiClient, long petId);
// Send a picture of your happy pet
//
char*
PetAPI_sharePicture(apiClient_t *apiClient, char *picture);
// Specialty of the shop // Specialty of the shop
// //
// Returns the kind of pet the store specializes in // Returns the kind of pet the store specializes in

View File

@ -9,6 +9,8 @@ Method | HTTP request | Description
[**PetAPI_findPetsByStatus**](PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status [**PetAPI_findPetsByStatus**](PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status
[**PetAPI_findPetsByTags**](PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags [**PetAPI_findPetsByTags**](PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags
[**PetAPI_getPetById**](PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID [**PetAPI_getPetById**](PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID
[**PetAPI_isPetAvailable**](PetAPI.md#PetAPI_isPetAvailable) | **POST** /pet/{petId}/isAvailable | Is this pet still available?
[**PetAPI_sharePicture**](PetAPI.md#PetAPI_sharePicture) | **POST** /pet/picture | Send a picture of your happy pet
[**PetAPI_specialtyPet**](PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop [**PetAPI_specialtyPet**](PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop
[**PetAPI_updatePet**](PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet [**PetAPI_updatePet**](PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet
[**PetAPI_updatePetWithForm**](PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data [**PetAPI_updatePetWithForm**](PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data
@ -165,6 +167,65 @@ Name | Type | Description | Notes
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_isPetAvailable**
```c
// Is this pet still available?
//
bit_t* PetAPI_isPetAvailable(apiClient_t *apiClient, long petId);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
**petId** | **long** | ID of pet to check |
### Return type
[bit_t](bit.md) *
### Authorization
[petstore_auth](../README.md#petstore_auth)
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_sharePicture**
```c
// Send a picture of your happy pet
//
char* PetAPI_sharePicture(apiClient_t *apiClient, char *picture);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
**picture** | **char \*** | A picture you want to share |
### Return type
char*
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: */*
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_specialtyPet** # **PetAPI_specialtyPet**
```c ```c
// Specialty of the shop // Specialty of the shop

View File

@ -0,0 +1,9 @@
# bit_t
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -78,6 +78,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->code // api_response->code
cJSON *code = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "code"); cJSON *code = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "code");
if (cJSON_IsNull(code)) {
code = NULL;
}
if (code) { if (code) {
if(!cJSON_IsNumber(code)) if(!cJSON_IsNumber(code))
{ {
@ -87,6 +90,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->type // api_response->type
cJSON *type = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "type"); cJSON *type = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "type");
if (cJSON_IsNull(type)) {
type = NULL;
}
if (type) { if (type) {
if(!cJSON_IsString(type) && !cJSON_IsNull(type)) if(!cJSON_IsString(type) && !cJSON_IsNull(type))
{ {
@ -96,6 +102,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->message // api_response->message
cJSON *message = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "message"); cJSON *message = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "message");
if (cJSON_IsNull(message)) {
message = NULL;
}
if (message) { if (message) {
if(!cJSON_IsString(message) && !cJSON_IsNull(message)) if(!cJSON_IsString(message) && !cJSON_IsNull(message))
{ {

View File

@ -0,0 +1,41 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "bit.h"
char* bit_bit_ToString(openapi_petstore_bit__e bit) {
char *bitArray[] = { "NULL", "0", "1" };
return bitArray[bit];
}
openapi_petstore_bit__e bit_bit_FromString(char* bit) {
int stringToReturn = 0;
char *bitArray[] = { "NULL", "0", "1" };
size_t sizeofArray = sizeof(bitArray) / sizeof(bitArray[0]);
while(stringToReturn < sizeofArray) {
if(strcmp(bit, bitArray[stringToReturn]) == 0) {
return stringToReturn;
}
stringToReturn++;
}
return 0;
}
cJSON *bit_convertToJSON(openapi_petstore_bit__e bit) {
cJSON *item = cJSON_CreateObject();
if(cJSON_AddNumberToObject(item, "bit", bit) == NULL) {
goto fail;
}
return item;
fail:
cJSON_Delete(item);
return NULL;
}
openapi_petstore_bit__e bit_parseFromJSON(cJSON *bitJSON) {
if(!cJSON_IsNumber(bitJSON)) {
return 0;
}
return bitJSON->valueint;
}

View File

@ -0,0 +1,32 @@
/*
* bit.h
*
* bit value
*/
#ifndef _bit_H_
#define _bit_H_
#include <string.h>
#include "../external/cJSON.h"
#include "../include/list.h"
#include "../include/keyValuePair.h"
#include "../include/binary.h"
typedef struct bit_t bit_t;
// Enum for bit
typedef enum { openapi_petstore_bit__NULL = 0, openapi_petstore_bit___0, openapi_petstore_bit___1 } openapi_petstore_bit__e;
char* bit_bit_ToString(openapi_petstore_bit__e bit);
openapi_petstore_bit__e bit_bit_FromString(char* bit);
cJSON *bit_convertToJSON(openapi_petstore_bit__e bit);
openapi_petstore_bit__e bit_parseFromJSON(cJSON *bitJSON);
#endif /* _bit_H_ */

View File

@ -64,6 +64,9 @@ category_t *category_parseFromJSON(cJSON *categoryJSON){
// category->id // category->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(categoryJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(categoryJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -73,6 +76,9 @@ category_t *category_parseFromJSON(cJSON *categoryJSON){
// category->name // category->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(categoryJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(categoryJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (name) { if (name) {
if(!cJSON_IsString(name) && !cJSON_IsNull(name)) if(!cJSON_IsString(name) && !cJSON_IsNull(name))
{ {

View File

@ -64,6 +64,9 @@ MappedModel_t *MappedModel_parseFromJSON(cJSON *MappedModelJSON){
// MappedModel->another_property // MappedModel->another_property
cJSON *another_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "another_property"); cJSON *another_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "another_property");
if (cJSON_IsNull(another_property)) {
another_property = NULL;
}
if (another_property) { if (another_property) {
if(!cJSON_IsNumber(another_property)) if(!cJSON_IsNumber(another_property))
{ {
@ -73,6 +76,9 @@ MappedModel_t *MappedModel_parseFromJSON(cJSON *MappedModelJSON){
// MappedModel->uuid_property // MappedModel->uuid_property
cJSON *uuid_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "uuid_property"); cJSON *uuid_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "uuid_property");
if (cJSON_IsNull(uuid_property)) {
uuid_property = NULL;
}
if (uuid_property) { if (uuid_property) {
if(!cJSON_IsString(uuid_property) && !cJSON_IsNull(uuid_property)) if(!cJSON_IsString(uuid_property) && !cJSON_IsNull(uuid_property))
{ {

View File

@ -101,6 +101,9 @@ model_with_set_propertes_t *model_with_set_propertes_parseFromJSON(cJSON *model_
// model_with_set_propertes->tag_set // model_with_set_propertes->tag_set
cJSON *tag_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "tag_set"); cJSON *tag_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "tag_set");
if (cJSON_IsNull(tag_set)) {
tag_set = NULL;
}
if (tag_set) { if (tag_set) {
cJSON *tag_set_local_nonprimitive = NULL; cJSON *tag_set_local_nonprimitive = NULL;
if(!cJSON_IsArray(tag_set)){ if(!cJSON_IsArray(tag_set)){
@ -122,6 +125,9 @@ model_with_set_propertes_t *model_with_set_propertes_parseFromJSON(cJSON *model_
// model_with_set_propertes->string_set // model_with_set_propertes->string_set
cJSON *string_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "string_set"); cJSON *string_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "string_set");
if (cJSON_IsNull(string_set)) {
string_set = NULL;
}
if (string_set) { if (string_set) {
cJSON *string_set_local = NULL; cJSON *string_set_local = NULL;
if(!cJSON_IsArray(string_set)) { if(!cJSON_IsArray(string_set)) {

View File

@ -122,6 +122,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->id // order->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(orderJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(orderJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -131,6 +134,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->pet_id // order->pet_id
cJSON *pet_id = cJSON_GetObjectItemCaseSensitive(orderJSON, "petId"); cJSON *pet_id = cJSON_GetObjectItemCaseSensitive(orderJSON, "petId");
if (cJSON_IsNull(pet_id)) {
pet_id = NULL;
}
if (pet_id) { if (pet_id) {
if(!cJSON_IsNumber(pet_id)) if(!cJSON_IsNumber(pet_id))
{ {
@ -140,6 +146,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->quantity // order->quantity
cJSON *quantity = cJSON_GetObjectItemCaseSensitive(orderJSON, "quantity"); cJSON *quantity = cJSON_GetObjectItemCaseSensitive(orderJSON, "quantity");
if (cJSON_IsNull(quantity)) {
quantity = NULL;
}
if (quantity) { if (quantity) {
if(!cJSON_IsNumber(quantity)) if(!cJSON_IsNumber(quantity))
{ {
@ -149,6 +158,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->ship_date // order->ship_date
cJSON *ship_date = cJSON_GetObjectItemCaseSensitive(orderJSON, "shipDate"); cJSON *ship_date = cJSON_GetObjectItemCaseSensitive(orderJSON, "shipDate");
if (cJSON_IsNull(ship_date)) {
ship_date = NULL;
}
if (ship_date) { if (ship_date) {
if(!cJSON_IsString(ship_date) && !cJSON_IsNull(ship_date)) if(!cJSON_IsString(ship_date) && !cJSON_IsNull(ship_date))
{ {
@ -158,6 +170,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->status // order->status
cJSON *status = cJSON_GetObjectItemCaseSensitive(orderJSON, "status"); cJSON *status = cJSON_GetObjectItemCaseSensitive(orderJSON, "status");
if (cJSON_IsNull(status)) {
status = NULL;
}
openapi_petstore_order_STATUS_e statusVariable; openapi_petstore_order_STATUS_e statusVariable;
if (status) { if (status) {
if(!cJSON_IsString(status)) if(!cJSON_IsString(status))
@ -169,6 +184,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->complete // order->complete
cJSON *complete = cJSON_GetObjectItemCaseSensitive(orderJSON, "complete"); cJSON *complete = cJSON_GetObjectItemCaseSensitive(orderJSON, "complete");
if (cJSON_IsNull(complete)) {
complete = NULL;
}
if (complete) { if (complete) {
if(!cJSON_IsBool(complete)) if(!cJSON_IsBool(complete))
{ {

View File

@ -177,6 +177,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->id // pet->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(petJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(petJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -186,12 +189,18 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->category // pet->category
cJSON *category = cJSON_GetObjectItemCaseSensitive(petJSON, "category"); cJSON *category = cJSON_GetObjectItemCaseSensitive(petJSON, "category");
if (cJSON_IsNull(category)) {
category = NULL;
}
if (category) { if (category) {
category_local_nonprim = category_parseFromJSON(category); //nonprimitive category_local_nonprim = category_parseFromJSON(category); //nonprimitive
} }
// pet->name // pet->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(petJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(petJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (!name) { if (!name) {
goto end; goto end;
} }
@ -204,6 +213,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->photo_urls // pet->photo_urls
cJSON *photo_urls = cJSON_GetObjectItemCaseSensitive(petJSON, "photoUrls"); cJSON *photo_urls = cJSON_GetObjectItemCaseSensitive(petJSON, "photoUrls");
if (cJSON_IsNull(photo_urls)) {
photo_urls = NULL;
}
if (!photo_urls) { if (!photo_urls) {
goto end; goto end;
} }
@ -226,6 +238,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->tags // pet->tags
cJSON *tags = cJSON_GetObjectItemCaseSensitive(petJSON, "tags"); cJSON *tags = cJSON_GetObjectItemCaseSensitive(petJSON, "tags");
if (cJSON_IsNull(tags)) {
tags = NULL;
}
if (tags) { if (tags) {
cJSON *tags_local_nonprimitive = NULL; cJSON *tags_local_nonprimitive = NULL;
if(!cJSON_IsArray(tags)){ if(!cJSON_IsArray(tags)){
@ -247,6 +262,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->status // pet->status
cJSON *status = cJSON_GetObjectItemCaseSensitive(petJSON, "status"); cJSON *status = cJSON_GetObjectItemCaseSensitive(petJSON, "status");
if (cJSON_IsNull(status)) {
status = NULL;
}
openapi_petstore_pet_STATUS_e statusVariable; openapi_petstore_pet_STATUS_e statusVariable;
if (status) { if (status) {
if(!cJSON_IsString(status)) if(!cJSON_IsString(status))

View File

@ -34,14 +34,8 @@ fail:
} }
openapi_petstore_preference__e preference_parseFromJSON(cJSON *preferenceJSON) { openapi_petstore_preference__e preference_parseFromJSON(cJSON *preferenceJSON) {
openapi_petstore_preference__e *preference = NULL; if(!cJSON_IsString(preferenceJSON) || (preferenceJSON->valuestring == NULL)) {
openapi_petstore_preference__e preferenceVariable; return 0;
cJSON *preferenceVar = cJSON_GetObjectItemCaseSensitive(preferenceJSON, "preference");
if(!cJSON_IsString(preferenceVar) || (preferenceVar->valuestring == NULL)){
goto end;
} }
preferenceVariable = preference_preference_FromString(preferenceVar->valuestring); return preference_preference_FromString(preferenceJSON->valuestring);
return preferenceVariable;
end:
return 0;
} }

View File

@ -64,6 +64,9 @@ tag_t *tag_parseFromJSON(cJSON *tagJSON){
// tag->id // tag->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(tagJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(tagJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -73,6 +76,9 @@ tag_t *tag_parseFromJSON(cJSON *tagJSON){
// tag->name // tag->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(tagJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(tagJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (name) { if (name) {
if(!cJSON_IsString(name) && !cJSON_IsNull(name)) if(!cJSON_IsString(name) && !cJSON_IsNull(name))
{ {

View File

@ -193,6 +193,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->id // user->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(userJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(userJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -202,6 +205,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->username // user->username
cJSON *username = cJSON_GetObjectItemCaseSensitive(userJSON, "username"); cJSON *username = cJSON_GetObjectItemCaseSensitive(userJSON, "username");
if (cJSON_IsNull(username)) {
username = NULL;
}
if (username) { if (username) {
if(!cJSON_IsString(username) && !cJSON_IsNull(username)) if(!cJSON_IsString(username) && !cJSON_IsNull(username))
{ {
@ -211,6 +217,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->first_name // user->first_name
cJSON *first_name = cJSON_GetObjectItemCaseSensitive(userJSON, "firstName"); cJSON *first_name = cJSON_GetObjectItemCaseSensitive(userJSON, "firstName");
if (cJSON_IsNull(first_name)) {
first_name = NULL;
}
if (first_name) { if (first_name) {
if(!cJSON_IsString(first_name) && !cJSON_IsNull(first_name)) if(!cJSON_IsString(first_name) && !cJSON_IsNull(first_name))
{ {
@ -220,6 +229,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->last_name // user->last_name
cJSON *last_name = cJSON_GetObjectItemCaseSensitive(userJSON, "lastName"); cJSON *last_name = cJSON_GetObjectItemCaseSensitive(userJSON, "lastName");
if (cJSON_IsNull(last_name)) {
last_name = NULL;
}
if (last_name) { if (last_name) {
if(!cJSON_IsString(last_name) && !cJSON_IsNull(last_name)) if(!cJSON_IsString(last_name) && !cJSON_IsNull(last_name))
{ {
@ -229,6 +241,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->email // user->email
cJSON *email = cJSON_GetObjectItemCaseSensitive(userJSON, "email"); cJSON *email = cJSON_GetObjectItemCaseSensitive(userJSON, "email");
if (cJSON_IsNull(email)) {
email = NULL;
}
if (email) { if (email) {
if(!cJSON_IsString(email) && !cJSON_IsNull(email)) if(!cJSON_IsString(email) && !cJSON_IsNull(email))
{ {
@ -238,6 +253,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->password // user->password
cJSON *password = cJSON_GetObjectItemCaseSensitive(userJSON, "password"); cJSON *password = cJSON_GetObjectItemCaseSensitive(userJSON, "password");
if (cJSON_IsNull(password)) {
password = NULL;
}
if (password) { if (password) {
if(!cJSON_IsString(password) && !cJSON_IsNull(password)) if(!cJSON_IsString(password) && !cJSON_IsNull(password))
{ {
@ -247,6 +265,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->phone // user->phone
cJSON *phone = cJSON_GetObjectItemCaseSensitive(userJSON, "phone"); cJSON *phone = cJSON_GetObjectItemCaseSensitive(userJSON, "phone");
if (cJSON_IsNull(phone)) {
phone = NULL;
}
if (phone) { if (phone) {
if(!cJSON_IsString(phone) && !cJSON_IsNull(phone)) if(!cJSON_IsString(phone) && !cJSON_IsNull(phone))
{ {
@ -256,6 +277,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->user_status // user->user_status
cJSON *user_status = cJSON_GetObjectItemCaseSensitive(userJSON, "userStatus"); cJSON *user_status = cJSON_GetObjectItemCaseSensitive(userJSON, "userStatus");
if (cJSON_IsNull(user_status)) {
user_status = NULL;
}
if (user_status) { if (user_status) {
if(!cJSON_IsNumber(user_status)) if(!cJSON_IsNumber(user_status))
{ {
@ -265,6 +289,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->extra // user->extra
cJSON *extra = cJSON_GetObjectItemCaseSensitive(userJSON, "extra"); cJSON *extra = cJSON_GetObjectItemCaseSensitive(userJSON, "extra");
if (cJSON_IsNull(extra)) {
extra = NULL;
}
if (extra) { if (extra) {
cJSON *extra_local_map = NULL; cJSON *extra_local_map = NULL;
if(!cJSON_IsObject(extra) && !cJSON_IsNull(extra)) if(!cJSON_IsObject(extra) && !cJSON_IsNull(extra))
@ -285,6 +312,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->preference // user->preference
cJSON *preference = cJSON_GetObjectItemCaseSensitive(userJSON, "preference"); cJSON *preference = cJSON_GetObjectItemCaseSensitive(userJSON, "preference");
if (cJSON_IsNull(preference)) {
preference = NULL;
}
if (preference) { if (preference) {
preference_local_nonprim = preference_parseFromJSON(preference); //custom preference_local_nonprim = preference_parseFromJSON(preference); //custom
} }

View File

@ -0,0 +1,56 @@
#ifndef bit_TEST
#define bit_TEST
// the following is to include only the main from the first c file
#ifndef TEST_MAIN
#define TEST_MAIN
#define bit_MAIN
#endif // TEST_MAIN
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "../external/cJSON.h"
#include "../model/bit.h"
bit_t* instantiate_bit(int include_optional);
bit_t* instantiate_bit(int include_optional) {
bit_t* bit = NULL;
if (include_optional) {
bit = bit_create(
);
} else {
bit = bit_create(
);
}
return bit;
}
#ifdef bit_MAIN
void test_bit(int include_optional) {
bit_t* bit_1 = instantiate_bit(include_optional);
cJSON* jsonbit_1 = bit_convertToJSON(bit_1);
printf("bit :\n%s\n", cJSON_PrintUnformatted(jsonbit_1));
bit_t* bit_2 = bit_parseFromJSON(jsonbit_1);
cJSON* jsonbit_2 = bit_convertToJSON(bit_2);
printf("repeating bit:\n%s\n", cJSON_PrintUnformatted(jsonbit_2));
}
int main() {
test_bit(1);
test_bit(0);
printf("Hello world \n");
return 0;
}
#endif // bit_MAIN
#endif // bit_TEST

View File

@ -11,6 +11,7 @@ docs/PetAPI.md
docs/StoreAPI.md docs/StoreAPI.md
docs/UserAPI.md docs/UserAPI.md
docs/api_response.md docs/api_response.md
docs/bit.md
docs/category.md docs/category.md
docs/model_with_set_propertes.md docs/model_with_set_propertes.md
docs/order.md docs/order.md
@ -29,6 +30,8 @@ libcurl.licence
model/any_type.h model/any_type.h
model/api_response.c model/api_response.c
model/api_response.h model/api_response.h
model/bit.c
model/bit.h
model/category.c model/category.c
model/category.h model/category.h
model/mapped_model.c model/mapped_model.c

View File

@ -70,6 +70,8 @@ Category | Method | HTTP request | Description
*PetAPI* | [**PetAPI_findPetsByStatus**](docs/PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status *PetAPI* | [**PetAPI_findPetsByStatus**](docs/PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status
*PetAPI* | [**PetAPI_findPetsByTags**](docs/PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags *PetAPI* | [**PetAPI_findPetsByTags**](docs/PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags
*PetAPI* | [**PetAPI_getPetById**](docs/PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID *PetAPI* | [**PetAPI_getPetById**](docs/PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID
*PetAPI* | [**PetAPI_isPetAvailable**](docs/PetAPI.md#PetAPI_isPetAvailable) | **POST** /pet/{petId}/isAvailable | Is this pet still available?
*PetAPI* | [**PetAPI_sharePicture**](docs/PetAPI.md#PetAPI_sharePicture) | **POST** /pet/picture | Send a picture of your happy pet
*PetAPI* | [**PetAPI_specialtyPet**](docs/PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop *PetAPI* | [**PetAPI_specialtyPet**](docs/PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop
*PetAPI* | [**PetAPI_updatePet**](docs/PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet *PetAPI* | [**PetAPI_updatePet**](docs/PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet
*PetAPI* | [**PetAPI_updatePetWithForm**](docs/PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data *PetAPI* | [**PetAPI_updatePetWithForm**](docs/PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data
@ -93,6 +95,7 @@ Category | Method | HTTP request | Description
- [MappedModel_t](docs/MappedModel.md) - [MappedModel_t](docs/MappedModel.md)
- [api_response_t](docs/api_response.md) - [api_response_t](docs/api_response.md)
- [bit_t](docs/bit.md)
- [category_t](docs/category.md) - [category_t](docs/category.md)
- [model_with_set_propertes_t](docs/model_with_set_propertes.md) - [model_with_set_propertes_t](docs/model_with_set_propertes.md)
- [order_t](docs/order.md) - [order_t](docs/order.md)

View File

@ -460,6 +460,141 @@ end:
} }
// Is this pet still available?
//
openapi_petstore_bit__e
PetAPI_isPetAvailable(apiClient_t *apiClient, long petId)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/pet/{petId}/isAvailable")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/pet/{petId}/isAvailable");
// Path Params
long sizeOfPathParams_petId = sizeof(petId)+3 + strlen("{ petId }");
if(petId == 0){
goto end;
}
char* localVarToReplace_petId = malloc(sizeOfPathParams_petId);
snprintf(localVarToReplace_petId, sizeOfPathParams_petId, "{%s}", "petId");
char localVarBuff_petId[256];
intToStr(localVarBuff_petId, petId);
localVarPath = strReplace(localVarPath, localVarToReplace_petId, localVarBuff_petId);
list_addElement(localVarHeaderType,"application/json"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"POST");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","successful operation");
//}
//nonprimitive not container
cJSON *PetAPIlocalVarJSON = cJSON_Parse(apiClient->dataReceived);
openapi_petstore_bit__e elementToReturn = bit_parseFromJSON(PetAPIlocalVarJSON);
cJSON_Delete(PetAPIlocalVarJSON);
if(elementToReturn == 0) {
// return 0;
}
//return type
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
free(localVarToReplace_petId);
return elementToReturn;
end:
free(localVarPath);
return 0;
}
// Send a picture of your happy pet
//
char*
PetAPI_sharePicture(apiClient_t *apiClient, char *picture)
{
list_t *localVarQueryParameters = NULL;
list_t *localVarHeaderParameters = NULL;
list_t *localVarFormParameters = NULL;
list_t *localVarHeaderType = list_createList();
list_t *localVarContentType = NULL;
char *localVarBodyParameters = NULL;
// create the path
long sizeOfPath = strlen("/pet/picture")+1;
char *localVarPath = malloc(sizeOfPath);
snprintf(localVarPath, sizeOfPath, "/pet/picture");
// Body Param
localVarBodyParameters = strdup(picture);
list_addElement(localVarHeaderType,"*/*"); //produces
apiClient_invoke(apiClient,
localVarPath,
localVarQueryParameters,
localVarHeaderParameters,
localVarFormParameters,
localVarHeaderType,
localVarContentType,
localVarBodyParameters,
"POST");
// uncomment below to debug the error response
//if (apiClient->response_code == 200) {
// printf("%s\n","successful operation");
//}
//primitive return type simple
char* elementToReturn = strdup((char*)apiClient->dataReceived);
if (apiClient->dataReceived) {
free(apiClient->dataReceived);
apiClient->dataReceived = NULL;
apiClient->dataReceivedLen = 0;
}
list_freeList(localVarHeaderType);
free(localVarPath);
free(localVarBodyParameters);
return elementToReturn;
end:
free(localVarPath);
return NULL;
}
// Specialty of the shop // Specialty of the shop
// //
// Returns the kind of pet the store specializes in // Returns the kind of pet the store specializes in

View File

@ -6,6 +6,7 @@
#include "../include/keyValuePair.h" #include "../include/keyValuePair.h"
#include "../include/binary.h" #include "../include/binary.h"
#include "../model/api_response.h" #include "../model/api_response.h"
#include "../model/bit.h"
#include "../model/pet.h" #include "../model/pet.h"
#include "../model/preference.h" #include "../model/preference.h"
@ -49,6 +50,18 @@ pet_t*
PetAPI_getPetById(apiClient_t *apiClient, long petId); PetAPI_getPetById(apiClient_t *apiClient, long petId);
// Is this pet still available?
//
openapi_petstore_bit__e
PetAPI_isPetAvailable(apiClient_t *apiClient, long petId);
// Send a picture of your happy pet
//
char*
PetAPI_sharePicture(apiClient_t *apiClient, char *picture);
// Specialty of the shop // Specialty of the shop
// //
// Returns the kind of pet the store specializes in // Returns the kind of pet the store specializes in

View File

@ -9,6 +9,8 @@ Method | HTTP request | Description
[**PetAPI_findPetsByStatus**](PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status [**PetAPI_findPetsByStatus**](PetAPI.md#PetAPI_findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status
[**PetAPI_findPetsByTags**](PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags [**PetAPI_findPetsByTags**](PetAPI.md#PetAPI_findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags
[**PetAPI_getPetById**](PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID [**PetAPI_getPetById**](PetAPI.md#PetAPI_getPetById) | **GET** /pet/{petId} | Find pet by ID
[**PetAPI_isPetAvailable**](PetAPI.md#PetAPI_isPetAvailable) | **POST** /pet/{petId}/isAvailable | Is this pet still available?
[**PetAPI_sharePicture**](PetAPI.md#PetAPI_sharePicture) | **POST** /pet/picture | Send a picture of your happy pet
[**PetAPI_specialtyPet**](PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop [**PetAPI_specialtyPet**](PetAPI.md#PetAPI_specialtyPet) | **GET** /pet/specialty | Specialty of the shop
[**PetAPI_updatePet**](PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet [**PetAPI_updatePet**](PetAPI.md#PetAPI_updatePet) | **PUT** /pet | Update an existing pet
[**PetAPI_updatePetWithForm**](PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data [**PetAPI_updatePetWithForm**](PetAPI.md#PetAPI_updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data
@ -165,6 +167,65 @@ Name | Type | Description | Notes
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_isPetAvailable**
```c
// Is this pet still available?
//
bit_t* PetAPI_isPetAvailable(apiClient_t *apiClient, long petId);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
**petId** | **long** | ID of pet to check |
### Return type
[bit_t](bit.md) *
### Authorization
[petstore_auth](../README.md#petstore_auth)
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_sharePicture**
```c
// Send a picture of your happy pet
//
char* PetAPI_sharePicture(apiClient_t *apiClient, char *picture);
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**apiClient** | **apiClient_t \*** | context containing the client configuration |
**picture** | **char \*** | A picture you want to share |
### Return type
char*
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: */*
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **PetAPI_specialtyPet** # **PetAPI_specialtyPet**
```c ```c
// Specialty of the shop // Specialty of the shop

View File

@ -0,0 +1,9 @@
# bit_t
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -78,6 +78,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->code // api_response->code
cJSON *code = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "code"); cJSON *code = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "code");
if (cJSON_IsNull(code)) {
code = NULL;
}
if (code) { if (code) {
if(!cJSON_IsNumber(code)) if(!cJSON_IsNumber(code))
{ {
@ -87,6 +90,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->type // api_response->type
cJSON *type = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "type"); cJSON *type = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "type");
if (cJSON_IsNull(type)) {
type = NULL;
}
if (type) { if (type) {
if(!cJSON_IsString(type) && !cJSON_IsNull(type)) if(!cJSON_IsString(type) && !cJSON_IsNull(type))
{ {
@ -96,6 +102,9 @@ api_response_t *api_response_parseFromJSON(cJSON *api_responseJSON){
// api_response->message // api_response->message
cJSON *message = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "message"); cJSON *message = cJSON_GetObjectItemCaseSensitive(api_responseJSON, "message");
if (cJSON_IsNull(message)) {
message = NULL;
}
if (message) { if (message) {
if(!cJSON_IsString(message) && !cJSON_IsNull(message)) if(!cJSON_IsString(message) && !cJSON_IsNull(message))
{ {

View File

@ -0,0 +1,41 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "bit.h"
char* bit_bit_ToString(openapi_petstore_bit__e bit) {
char *bitArray[] = { "NULL", "0", "1" };
return bitArray[bit];
}
openapi_petstore_bit__e bit_bit_FromString(char* bit) {
int stringToReturn = 0;
char *bitArray[] = { "NULL", "0", "1" };
size_t sizeofArray = sizeof(bitArray) / sizeof(bitArray[0]);
while(stringToReturn < sizeofArray) {
if(strcmp(bit, bitArray[stringToReturn]) == 0) {
return stringToReturn;
}
stringToReturn++;
}
return 0;
}
cJSON *bit_convertToJSON(openapi_petstore_bit__e bit) {
cJSON *item = cJSON_CreateObject();
if(cJSON_AddNumberToObject(item, "bit", bit) == NULL) {
goto fail;
}
return item;
fail:
cJSON_Delete(item);
return NULL;
}
openapi_petstore_bit__e bit_parseFromJSON(cJSON *bitJSON) {
if(!cJSON_IsNumber(bitJSON)) {
return 0;
}
return bitJSON->valueint;
}

View File

@ -0,0 +1,32 @@
/*
* bit.h
*
* bit value
*/
#ifndef _bit_H_
#define _bit_H_
#include <string.h>
#include "../external/cJSON.h"
#include "../include/list.h"
#include "../include/keyValuePair.h"
#include "../include/binary.h"
typedef struct bit_t bit_t;
// Enum for bit
typedef enum { openapi_petstore_bit__NULL = 0, openapi_petstore_bit___0, openapi_petstore_bit___1 } openapi_petstore_bit__e;
char* bit_bit_ToString(openapi_petstore_bit__e bit);
openapi_petstore_bit__e bit_bit_FromString(char* bit);
cJSON *bit_convertToJSON(openapi_petstore_bit__e bit);
openapi_petstore_bit__e bit_parseFromJSON(cJSON *bitJSON);
#endif /* _bit_H_ */

View File

@ -64,6 +64,9 @@ category_t *category_parseFromJSON(cJSON *categoryJSON){
// category->id // category->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(categoryJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(categoryJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -73,6 +76,9 @@ category_t *category_parseFromJSON(cJSON *categoryJSON){
// category->name // category->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(categoryJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(categoryJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (name) { if (name) {
if(!cJSON_IsString(name) && !cJSON_IsNull(name)) if(!cJSON_IsString(name) && !cJSON_IsNull(name))
{ {

View File

@ -64,6 +64,9 @@ MappedModel_t *MappedModel_parseFromJSON(cJSON *MappedModelJSON){
// MappedModel->another_property // MappedModel->another_property
cJSON *another_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "another_property"); cJSON *another_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "another_property");
if (cJSON_IsNull(another_property)) {
another_property = NULL;
}
if (another_property) { if (another_property) {
if(!cJSON_IsNumber(another_property)) if(!cJSON_IsNumber(another_property))
{ {
@ -73,6 +76,9 @@ MappedModel_t *MappedModel_parseFromJSON(cJSON *MappedModelJSON){
// MappedModel->uuid_property // MappedModel->uuid_property
cJSON *uuid_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "uuid_property"); cJSON *uuid_property = cJSON_GetObjectItemCaseSensitive(MappedModelJSON, "uuid_property");
if (cJSON_IsNull(uuid_property)) {
uuid_property = NULL;
}
if (uuid_property) { if (uuid_property) {
if(!cJSON_IsString(uuid_property) && !cJSON_IsNull(uuid_property)) if(!cJSON_IsString(uuid_property) && !cJSON_IsNull(uuid_property))
{ {

View File

@ -101,6 +101,9 @@ model_with_set_propertes_t *model_with_set_propertes_parseFromJSON(cJSON *model_
// model_with_set_propertes->tag_set // model_with_set_propertes->tag_set
cJSON *tag_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "tag_set"); cJSON *tag_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "tag_set");
if (cJSON_IsNull(tag_set)) {
tag_set = NULL;
}
if (tag_set) { if (tag_set) {
cJSON *tag_set_local_nonprimitive = NULL; cJSON *tag_set_local_nonprimitive = NULL;
if(!cJSON_IsArray(tag_set)){ if(!cJSON_IsArray(tag_set)){
@ -122,6 +125,9 @@ model_with_set_propertes_t *model_with_set_propertes_parseFromJSON(cJSON *model_
// model_with_set_propertes->string_set // model_with_set_propertes->string_set
cJSON *string_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "string_set"); cJSON *string_set = cJSON_GetObjectItemCaseSensitive(model_with_set_propertesJSON, "string_set");
if (cJSON_IsNull(string_set)) {
string_set = NULL;
}
if (string_set) { if (string_set) {
cJSON *string_set_local = NULL; cJSON *string_set_local = NULL;
if(!cJSON_IsArray(string_set)) { if(!cJSON_IsArray(string_set)) {

View File

@ -122,6 +122,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->id // order->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(orderJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(orderJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -131,6 +134,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->pet_id // order->pet_id
cJSON *pet_id = cJSON_GetObjectItemCaseSensitive(orderJSON, "petId"); cJSON *pet_id = cJSON_GetObjectItemCaseSensitive(orderJSON, "petId");
if (cJSON_IsNull(pet_id)) {
pet_id = NULL;
}
if (pet_id) { if (pet_id) {
if(!cJSON_IsNumber(pet_id)) if(!cJSON_IsNumber(pet_id))
{ {
@ -140,6 +146,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->quantity // order->quantity
cJSON *quantity = cJSON_GetObjectItemCaseSensitive(orderJSON, "quantity"); cJSON *quantity = cJSON_GetObjectItemCaseSensitive(orderJSON, "quantity");
if (cJSON_IsNull(quantity)) {
quantity = NULL;
}
if (quantity) { if (quantity) {
if(!cJSON_IsNumber(quantity)) if(!cJSON_IsNumber(quantity))
{ {
@ -149,6 +158,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->ship_date // order->ship_date
cJSON *ship_date = cJSON_GetObjectItemCaseSensitive(orderJSON, "shipDate"); cJSON *ship_date = cJSON_GetObjectItemCaseSensitive(orderJSON, "shipDate");
if (cJSON_IsNull(ship_date)) {
ship_date = NULL;
}
if (ship_date) { if (ship_date) {
if(!cJSON_IsString(ship_date) && !cJSON_IsNull(ship_date)) if(!cJSON_IsString(ship_date) && !cJSON_IsNull(ship_date))
{ {
@ -158,6 +170,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->status // order->status
cJSON *status = cJSON_GetObjectItemCaseSensitive(orderJSON, "status"); cJSON *status = cJSON_GetObjectItemCaseSensitive(orderJSON, "status");
if (cJSON_IsNull(status)) {
status = NULL;
}
openapi_petstore_order_STATUS_e statusVariable; openapi_petstore_order_STATUS_e statusVariable;
if (status) { if (status) {
if(!cJSON_IsString(status)) if(!cJSON_IsString(status))
@ -169,6 +184,9 @@ order_t *order_parseFromJSON(cJSON *orderJSON){
// order->complete // order->complete
cJSON *complete = cJSON_GetObjectItemCaseSensitive(orderJSON, "complete"); cJSON *complete = cJSON_GetObjectItemCaseSensitive(orderJSON, "complete");
if (cJSON_IsNull(complete)) {
complete = NULL;
}
if (complete) { if (complete) {
if(!cJSON_IsBool(complete)) if(!cJSON_IsBool(complete))
{ {

View File

@ -177,6 +177,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->id // pet->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(petJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(petJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -186,12 +189,18 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->category // pet->category
cJSON *category = cJSON_GetObjectItemCaseSensitive(petJSON, "category"); cJSON *category = cJSON_GetObjectItemCaseSensitive(petJSON, "category");
if (cJSON_IsNull(category)) {
category = NULL;
}
if (category) { if (category) {
category_local_nonprim = category_parseFromJSON(category); //nonprimitive category_local_nonprim = category_parseFromJSON(category); //nonprimitive
} }
// pet->name // pet->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(petJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(petJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (!name) { if (!name) {
goto end; goto end;
} }
@ -204,6 +213,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->photo_urls // pet->photo_urls
cJSON *photo_urls = cJSON_GetObjectItemCaseSensitive(petJSON, "photoUrls"); cJSON *photo_urls = cJSON_GetObjectItemCaseSensitive(petJSON, "photoUrls");
if (cJSON_IsNull(photo_urls)) {
photo_urls = NULL;
}
if (!photo_urls) { if (!photo_urls) {
goto end; goto end;
} }
@ -226,6 +238,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->tags // pet->tags
cJSON *tags = cJSON_GetObjectItemCaseSensitive(petJSON, "tags"); cJSON *tags = cJSON_GetObjectItemCaseSensitive(petJSON, "tags");
if (cJSON_IsNull(tags)) {
tags = NULL;
}
if (tags) { if (tags) {
cJSON *tags_local_nonprimitive = NULL; cJSON *tags_local_nonprimitive = NULL;
if(!cJSON_IsArray(tags)){ if(!cJSON_IsArray(tags)){
@ -247,6 +262,9 @@ pet_t *pet_parseFromJSON(cJSON *petJSON){
// pet->status // pet->status
cJSON *status = cJSON_GetObjectItemCaseSensitive(petJSON, "status"); cJSON *status = cJSON_GetObjectItemCaseSensitive(petJSON, "status");
if (cJSON_IsNull(status)) {
status = NULL;
}
openapi_petstore_pet_STATUS_e statusVariable; openapi_petstore_pet_STATUS_e statusVariable;
if (status) { if (status) {
if(!cJSON_IsString(status)) if(!cJSON_IsString(status))

View File

@ -34,14 +34,8 @@ fail:
} }
openapi_petstore_preference__e preference_parseFromJSON(cJSON *preferenceJSON) { openapi_petstore_preference__e preference_parseFromJSON(cJSON *preferenceJSON) {
openapi_petstore_preference__e *preference = NULL; if(!cJSON_IsString(preferenceJSON) || (preferenceJSON->valuestring == NULL)) {
openapi_petstore_preference__e preferenceVariable; return 0;
cJSON *preferenceVar = cJSON_GetObjectItemCaseSensitive(preferenceJSON, "preference");
if(!cJSON_IsString(preferenceVar) || (preferenceVar->valuestring == NULL)){
goto end;
} }
preferenceVariable = preference_preference_FromString(preferenceVar->valuestring); return preference_preference_FromString(preferenceJSON->valuestring);
return preferenceVariable;
end:
return 0;
} }

View File

@ -64,6 +64,9 @@ tag_t *tag_parseFromJSON(cJSON *tagJSON){
// tag->id // tag->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(tagJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(tagJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -73,6 +76,9 @@ tag_t *tag_parseFromJSON(cJSON *tagJSON){
// tag->name // tag->name
cJSON *name = cJSON_GetObjectItemCaseSensitive(tagJSON, "name"); cJSON *name = cJSON_GetObjectItemCaseSensitive(tagJSON, "name");
if (cJSON_IsNull(name)) {
name = NULL;
}
if (name) { if (name) {
if(!cJSON_IsString(name) && !cJSON_IsNull(name)) if(!cJSON_IsString(name) && !cJSON_IsNull(name))
{ {

View File

@ -193,6 +193,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->id // user->id
cJSON *id = cJSON_GetObjectItemCaseSensitive(userJSON, "id"); cJSON *id = cJSON_GetObjectItemCaseSensitive(userJSON, "id");
if (cJSON_IsNull(id)) {
id = NULL;
}
if (id) { if (id) {
if(!cJSON_IsNumber(id)) if(!cJSON_IsNumber(id))
{ {
@ -202,6 +205,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->username // user->username
cJSON *username = cJSON_GetObjectItemCaseSensitive(userJSON, "username"); cJSON *username = cJSON_GetObjectItemCaseSensitive(userJSON, "username");
if (cJSON_IsNull(username)) {
username = NULL;
}
if (username) { if (username) {
if(!cJSON_IsString(username) && !cJSON_IsNull(username)) if(!cJSON_IsString(username) && !cJSON_IsNull(username))
{ {
@ -211,6 +217,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->first_name // user->first_name
cJSON *first_name = cJSON_GetObjectItemCaseSensitive(userJSON, "firstName"); cJSON *first_name = cJSON_GetObjectItemCaseSensitive(userJSON, "firstName");
if (cJSON_IsNull(first_name)) {
first_name = NULL;
}
if (first_name) { if (first_name) {
if(!cJSON_IsString(first_name) && !cJSON_IsNull(first_name)) if(!cJSON_IsString(first_name) && !cJSON_IsNull(first_name))
{ {
@ -220,6 +229,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->last_name // user->last_name
cJSON *last_name = cJSON_GetObjectItemCaseSensitive(userJSON, "lastName"); cJSON *last_name = cJSON_GetObjectItemCaseSensitive(userJSON, "lastName");
if (cJSON_IsNull(last_name)) {
last_name = NULL;
}
if (last_name) { if (last_name) {
if(!cJSON_IsString(last_name) && !cJSON_IsNull(last_name)) if(!cJSON_IsString(last_name) && !cJSON_IsNull(last_name))
{ {
@ -229,6 +241,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->email // user->email
cJSON *email = cJSON_GetObjectItemCaseSensitive(userJSON, "email"); cJSON *email = cJSON_GetObjectItemCaseSensitive(userJSON, "email");
if (cJSON_IsNull(email)) {
email = NULL;
}
if (email) { if (email) {
if(!cJSON_IsString(email) && !cJSON_IsNull(email)) if(!cJSON_IsString(email) && !cJSON_IsNull(email))
{ {
@ -238,6 +253,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->password // user->password
cJSON *password = cJSON_GetObjectItemCaseSensitive(userJSON, "password"); cJSON *password = cJSON_GetObjectItemCaseSensitive(userJSON, "password");
if (cJSON_IsNull(password)) {
password = NULL;
}
if (password) { if (password) {
if(!cJSON_IsString(password) && !cJSON_IsNull(password)) if(!cJSON_IsString(password) && !cJSON_IsNull(password))
{ {
@ -247,6 +265,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->phone // user->phone
cJSON *phone = cJSON_GetObjectItemCaseSensitive(userJSON, "phone"); cJSON *phone = cJSON_GetObjectItemCaseSensitive(userJSON, "phone");
if (cJSON_IsNull(phone)) {
phone = NULL;
}
if (phone) { if (phone) {
if(!cJSON_IsString(phone) && !cJSON_IsNull(phone)) if(!cJSON_IsString(phone) && !cJSON_IsNull(phone))
{ {
@ -256,6 +277,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->user_status // user->user_status
cJSON *user_status = cJSON_GetObjectItemCaseSensitive(userJSON, "userStatus"); cJSON *user_status = cJSON_GetObjectItemCaseSensitive(userJSON, "userStatus");
if (cJSON_IsNull(user_status)) {
user_status = NULL;
}
if (user_status) { if (user_status) {
if(!cJSON_IsNumber(user_status)) if(!cJSON_IsNumber(user_status))
{ {
@ -265,6 +289,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->extra // user->extra
cJSON *extra = cJSON_GetObjectItemCaseSensitive(userJSON, "extra"); cJSON *extra = cJSON_GetObjectItemCaseSensitive(userJSON, "extra");
if (cJSON_IsNull(extra)) {
extra = NULL;
}
if (extra) { if (extra) {
cJSON *extra_local_map = NULL; cJSON *extra_local_map = NULL;
if(!cJSON_IsObject(extra) && !cJSON_IsNull(extra)) if(!cJSON_IsObject(extra) && !cJSON_IsNull(extra))
@ -285,6 +312,9 @@ user_t *user_parseFromJSON(cJSON *userJSON){
// user->preference // user->preference
cJSON *preference = cJSON_GetObjectItemCaseSensitive(userJSON, "preference"); cJSON *preference = cJSON_GetObjectItemCaseSensitive(userJSON, "preference");
if (cJSON_IsNull(preference)) {
preference = NULL;
}
if (preference) { if (preference) {
preference_local_nonprim = preference_parseFromJSON(preference); //custom preference_local_nonprim = preference_parseFromJSON(preference); //custom
} }

View File

@ -0,0 +1,56 @@
#ifndef bit_TEST
#define bit_TEST
// the following is to include only the main from the first c file
#ifndef TEST_MAIN
#define TEST_MAIN
#define bit_MAIN
#endif // TEST_MAIN
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "../external/cJSON.h"
#include "../model/bit.h"
bit_t* instantiate_bit(int include_optional);
bit_t* instantiate_bit(int include_optional) {
bit_t* bit = NULL;
if (include_optional) {
bit = bit_create(
);
} else {
bit = bit_create(
);
}
return bit;
}
#ifdef bit_MAIN
void test_bit(int include_optional) {
bit_t* bit_1 = instantiate_bit(include_optional);
cJSON* jsonbit_1 = bit_convertToJSON(bit_1);
printf("bit :\n%s\n", cJSON_Print(jsonbit_1));
bit_t* bit_2 = bit_parseFromJSON(jsonbit_1);
cJSON* jsonbit_2 = bit_convertToJSON(bit_2);
printf("repeating bit:\n%s\n", cJSON_Print(jsonbit_2));
}
int main() {
test_bit(1);
test_bit(0);
printf("Hello world \n");
return 0;
}
#endif // bit_MAIN
#endif // bit_TEST