Skip to content

Commit

Permalink
move safeParseArray to own file, update imports
Browse files Browse the repository at this point in the history
  • Loading branch information
anncatton committed Sep 30, 2024
1 parent e995c79 commit e866b2b
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 37 deletions.
3 changes: 1 addition & 2 deletions src/jobs/ega/egaClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,9 @@ import {
GetUserFailure,
Result,
RevokePermissionsFailure,
safeParseArray,
success,
ZodResultAccumulator,
} from './types/results';
import { safeParseArray, ZodResultAccumulator } from './types/zodSafeParseArray';
import { ApprovedUser, getErrorMessage } from './utils';

const { DACS, DATASETS, PERMISSIONS, REQUESTS, USERS } = EGA_API;
Expand Down
35 changes: 0 additions & 35 deletions src/jobs/ega/types/results.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import { z, ZodError, ZodTypeAny } from 'zod';

/* ******************* *
Success and Failure types
* ******************* */
Expand Down Expand Up @@ -76,39 +74,6 @@ export const failure = <FailureStatus extends string>(
data: undefined,
});

export type ZodResultAccumulator<T> = { success: T[]; failure: ZodError[] };
/**
* Parses an array of Zod SafeParseReturnType results into success (successful parse) and failure (parsing error)
* @param acc ZodResultAccumulator<T>
* @param item z.SafeParseReturnType<T, T>
* @returns ZodResultAccumulator<T>
*/
const resultReducer = <T>(acc: ZodResultAccumulator<T>, item: z.SafeParseReturnType<T, T>) => {
if (item.success) {
acc.success.push(item.data);
} else {
acc.failure.push(item.error);
}
return acc;
};

/**
* Run Zod safeParse for Schema T on an array of items, and split results by SafeParseReturnType 'success' or 'error'.
* @params schema<T>
* @params data unknown[]
* @returns { success: [], failure: [] }
*/
export const safeParseArray = <T extends ZodTypeAny>(
schema: T,
data: Array<unknown>,
): ZodResultAccumulator<z.infer<T>> =>
data
.map((i) => schema.safeParse(i))
.reduce<ZodResultAccumulator<z.infer<T>>>((acc, item) => resultReducer(acc, item), {
success: [],
failure: [],
});

/* ******************* *
Failure types
* ******************* */
Expand Down
53 changes: 53 additions & 0 deletions src/jobs/ega/types/zodSafeParseArray.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright (c) 2024 The Ontario Institute for Cancer Research. All rights reserved
*
* This program and the accompanying materials are made available under the terms of
* the GNU Affero General Public License v3.0. You should have received a copy of the
* GNU Affero General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import { z, ZodError, ZodTypeAny } from 'zod';

export type ZodResultAccumulator<T> = { success: T[]; failure: ZodError[] };
/**
* Parses an array of Zod SafeParseReturnType results into success (successful parse) and failure (parsing error)
* @param acc ZodResultAccumulator<T>
* @param item z.SafeParseReturnType<T, T>
* @returns ZodResultAccumulator<T>
*/
const resultReducer = <T>(acc: ZodResultAccumulator<T>, item: z.SafeParseReturnType<T, T>) => {
if (item.success) {
acc.success.push(item.data);
} else {
acc.failure.push(item.error);
}
return acc;
};

/**
* Run Zod safeParse for Schema T on an array of items, and split results by SafeParseReturnType 'success' or 'error'.
* @params schema<T>
* @params data unknown[]
* @returns { success: [], failure: [] }
*/
export const safeParseArray = <T extends ZodTypeAny>(
schema: T,
data: Array<unknown>,
): ZodResultAccumulator<z.infer<T>> =>
data
.map((i) => schema.safeParse(i))
.reduce<ZodResultAccumulator<z.infer<T>>>((acc, item) => resultReducer(acc, item), {
success: [],
failure: [],
});

0 comments on commit e866b2b

Please sign in to comment.