data.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { StateTransformer, StateTransform, StateObjectSelector, StateObjectCell } from '../../../mol-state';
  7. import { PluginContext } from '../../context';
  8. import { Download, ReadFile } from '../transforms/data';
  9. import { getFileInfo } from '../../../mol-util/file-info';
  10. import { DataFormatProvider } from './data/provider';
  11. import { BuiltInDataFormats } from './data/formats';
  12. import { objectForEach } from '../../../mol-util/object';
  13. export class DataManager {
  14. readonly formats: DataFormatProvider[] = [];
  15. addFormat(p: DataFormatProvider) {
  16. this.formats.push(p);
  17. }
  18. get dataState() {
  19. return this.plugin.state.dataState;
  20. }
  21. async download(params: StateTransformer.Params<Download>, options?: Partial<StateTransform.Options>) {
  22. const data = this.dataState.build().toRoot().apply(Download, params, options);
  23. await this.plugin.runTask(this.dataState.updateTree(data));
  24. return { data: data.selector };
  25. }
  26. async readFile(params: StateTransformer.Params<ReadFile>, options?: Partial<StateTransform.Options>) {
  27. const data = this.dataState.build().toRoot().apply(ReadFile, params, options);
  28. const fileInfo = getFileInfo(params.file);
  29. await this.plugin.runTask(this.dataState.updateTree(data));
  30. return { data: data.selector, fileInfo };
  31. }
  32. async parse<K extends keyof BuiltInDataFormats, P extends BuiltInDataFormats[K]>(provider: K, data: StateObjectSelector<DataFormatProvider.Data<P>> | StateObjectCell | string, params?: DataFormatProvider.Params<P>): Promise<DataFormatProvider.Ret<P>>
  33. async parse<P extends DataFormatProvider>(provider: P, data: StateObjectSelector<DataFormatProvider.Data<P>> | StateObjectCell | string, params?: DataFormatProvider.Params<P>): Promise<DataFormatProvider.Ret<P>>
  34. async parse<P extends DataFormatProvider>(providerOrBuildIn: P | string, data: StateObjectSelector<DataFormatProvider.Data<P>> | StateObjectCell | StateTransform.Ref, params?: DataFormatProvider.Params<P>) {
  35. const provider: P = typeof providerOrBuildIn === 'string' ? BuiltInDataFormats[providerOrBuildIn as keyof BuiltInDataFormats] as unknown as P : providerOrBuildIn as P;
  36. const cell = StateObjectCell.resolve(this.dataState, data);
  37. if (!cell) {
  38. throw new Error('Could not resolve data cell.');
  39. }
  40. return provider.apply({ state: this.dataState, plugin: this.plugin }, cell, params);
  41. }
  42. // async test() {
  43. // const { data } = await this.download({ url: '' });
  44. // const cif = await this.parse('mmcif', data);
  45. // }
  46. constructor(public plugin: PluginContext) {
  47. objectForEach(BuiltInDataFormats, f => this.formats.push(f));
  48. }
  49. }