Skip to content
Snippets Groups Projects
Commit d9dced28 authored by David Sehnal's avatar David Sehnal
Browse files

Better typing for Mapped param

parent b272c3a5
No related branches found
No related tags found
No related merge requests found
...@@ -21,64 +21,48 @@ import { ElementSymbolColorThemeParams } from 'mol-theme/color/element-symbol'; ...@@ -21,64 +21,48 @@ import { ElementSymbolColorThemeParams } from 'mol-theme/color/element-symbol';
// TODO: "structure parser provider" // TODO: "structure parser provider"
export { DownloadStructure } export { DownloadStructure }
namespace DownloadStructure { type DownloadStructure = typeof DownloadStructure
export type Source = PD.NamedParamUnion<ObtainStructureHelpers.ControlMap> const DownloadStructure = StateAction.build({
export interface Params { from: PluginStateObject.Root,
source: Source display: { name: 'Download Structure', description: 'Load a structure from the provided source and create its default Assembly and visual.' },
} params: {
} source: PD.MappedStatic('bcif-static', {
namespace ObtainStructureHelpers { 'pdbe-updated': PD.Text('1cbs', { label: 'Id' }),
export const ControlMap = { 'rcsb': PD.Text('1tqn', { label: 'Id' }),
'pdbe-updated': PD.Text('1cbs', { label: 'Id' }), 'bcif-static': PD.Text('1tqn', { label: 'Id' }),
'rcsb': PD.Text('1tqn', { label: 'Id' }), 'url': PD.Group({ url: PD.Text(''), isBinary: PD.Boolean(false) }, { isExpanded: true })
'bcif-static': PD.Text('1tqn', { label: 'Id' }), }, {
'url': PD.Group({ url: PD.Text(''), isBinary: PD.Boolean(false) }, { isExpanded: true }) options: [
['pdbe-updated', 'PDBe Updated'],
['rcsb', 'RCSB'],
['bcif-static', 'BinaryCIF (static PDBe Updated)'],
['url', 'URL']
]
})
} }
export type ControlMap = typeof ControlMap })(({ params, state }) => {
export const SourceOptions: [keyof ControlMap, string][] = [ const b = state.build();
['pdbe-updated', 'PDBe Updated'], const src = params.source;
['rcsb', 'RCSB'], let url: Transformer.Params<Download>;
['bcif-static', 'BinaryCIF (static PDBe Updated)'],
['url', 'URL'] switch (src.name) {
]; case 'url':
url = src.params;
export function getControls(key: string) { return (ControlMap as any)[key]; } break;
export function getUrl(src: DownloadStructure.Source): Transformer.Params<Download> { case 'pdbe-updated':
switch (src.name) { url = { url: `https://www.ebi.ac.uk/pdbe/static/entry/${src.params.toLowerCase()}_updated.cif`, isBinary: false, label: `PDBe: ${src.params}` };
case 'url': return src.params; break;
case 'pdbe-updated': return { url: `https://www.ebi.ac.uk/pdbe/static/entry/${src.params.toLowerCase()}_updated.cif`, isBinary: false, label: `PDBe: ${src.params}` }; case 'rcsb':
case 'rcsb': return { url: `https://files.rcsb.org/download/${src.params.toUpperCase()}.cif`, isBinary: false, label: `RCSB: ${src.params}` }; url = { url: `https://files.rcsb.org/download/${src.params.toUpperCase()}.cif`, isBinary: false, label: `RCSB: ${src.params}` };
case 'bcif-static': return { url: `https://webchem.ncbr.muni.cz/ModelServer/static/bcif/${src.params.toLowerCase()}`, isBinary: true, label: `BinaryCIF: ${src.params}` }; break;
default: throw new Error(`${(src as any).name} not supported.`); case 'bcif-static':
} url = { url: `https://webchem.ncbr.muni.cz/ModelServer/static/bcif/${src.params.toLowerCase()}`, isBinary: true, label: `BinaryCIF: ${src.params}` };
break;
default: throw new Error(`${(src as any).name} not supported.`);
} }
}
const DownloadStructure = StateAction.create<PluginStateObject.Root, void, DownloadStructure.Params>({
from: [PluginStateObject.Root],
display: {
name: 'Download Structure',
description: 'Load a structure from PDBe and create its default Assembly and visual'
},
params: () => ({ source: PD.Mapped('bcif-static', ObtainStructureHelpers.SourceOptions, ObtainStructureHelpers.getControls) }),
run({ params, state }) {
const b = state.build();
// const query = MolScriptBuilder.struct.generator.atomGroups({
// // 'atom-test': MolScriptBuilder.core.rel.eq([
// // MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(),
// // MolScriptBuilder.es('C')
// // ]),
// 'residue-test': MolScriptBuilder.core.rel.eq([
// MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(),
// 'ALA'
// ])
// });
const url = ObtainStructureHelpers.getUrl(params.source); const data = b.toRoot().apply(StateTransforms.Data.Download, url);
return state.update(createStructureTree(data));
const data = b.toRoot().apply(StateTransforms.Data.Download, url);
return state.update(createStructureTree(data));
}
}); });
export const OpenStructure = StateAction.build({ export const OpenStructure = StateAction.build({
......
...@@ -151,17 +151,29 @@ export namespace ParamDefinition { ...@@ -151,17 +151,29 @@ export namespace ParamDefinition {
export interface NamedParams<T = any, K = string> { name: K, params: T } export interface NamedParams<T = any, K = string> { name: K, params: T }
export type NamedParamUnion<P extends Params, K = keyof P> = K extends any ? NamedParams<P[K]['defaultValue'], K> : never export type NamedParamUnion<P extends Params, K = keyof P> = K extends any ? NamedParams<P[K]['defaultValue'], K> : never
export interface Mapped<T> extends Base<NamedParams<T>> { export interface Mapped<T extends NamedParams<any, any>> extends Base<T> {
type: 'mapped', type: 'mapped',
select: Select<string>, select: Select<string>,
map(name: string): Any map(name: string): Any
} }
export function Mapped<T>(defaultKey: string, names: [string, string][], map: Mapped<T>['map'], info?: Info): Mapped<T> { export function Mapped<T>(defaultKey: string, names: [string, string][], map: (name: string) => Any, info?: Info): Mapped<NamedParams<T>> {
return setInfo<Mapped<T>>({ return setInfo<Mapped<NamedParams<T>>>({
type: 'mapped', type: 'mapped',
defaultValue: { name: defaultKey, params: map(defaultKey).defaultValue as any }, defaultValue: { name: defaultKey, params: map(defaultKey).defaultValue as any },
select: Select<string>(defaultKey, names, info), select: Select<string>(defaultKey, names, info),
map }, info); map
}, info);
}
export function MappedStatic<C extends Params>(defaultKey: keyof C, map: C, info?: Info & { options?: [keyof C, string][] }): Mapped<NamedParamUnion<C>> {
const options: [string, string][] = info && info.options
? info.options as [string, string][]
: Object.keys(map).map(k => [k, k]) as [string, string][];
return setInfo<Mapped<NamedParamUnion<C>>>({
type: 'mapped',
defaultValue: { name: defaultKey, params: map[defaultKey].defaultValue } as any,
select: Select<string>(defaultKey as string, options, info),
map: key => map[key]
}, info);
} }
export interface Converted<T, C> extends Base<T> { export interface Converted<T, C> extends Base<T> {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment