Skip to content
This repository has been archived by the owner on Jan 25, 2024. It is now read-only.

Commit

Permalink
feat(sassdatacontext): implement sassdatacontext
Browse files Browse the repository at this point in the history
  • Loading branch information
kwonoj committed Jul 13, 2018
1 parent c7bffe6 commit 4999714
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/interop/context.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { SassFileContext, SassFileContextInterface } from './file/sassFileContext';
import { SassDataContext } from './data/sassDataContext';
import { SassFileContext, SassSourceContext } from './file/sassFileContext';
import { buildInteropUtility } from './interopUtility';
import { SassOptions, SassOptionsInterface } from './options/sassOptions';
import { wrapSassOptions } from './options/wrapSassOptions';
Expand All @@ -22,7 +23,10 @@ const buildContext = (
create: () => new SassOptions(cwrapContext, cwrapOptions, mount, unmount, str) as SassOptionsInterface
},
file: {
create: (inputPath: string) => new SassFileContext(inputPath, cwrapContext, str) as SassFileContextInterface
create: (inputPath: string) => new SassFileContext(inputPath, cwrapContext, str) as SassSourceContext
},
data: {
create: (input: string) => new SassDataContext(input, cwrapContext, str) as SassSourceContext
}
};
};
Expand Down
69 changes: 69 additions & 0 deletions src/interop/data/sassDataContext.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { log } from '../../util/logger';
import { StringMethodInterface } from '../interopUtility';
import { SassOptions, SassOptionsInterface } from '../options/sassOptions';
import { SassContext, SassContextInterface } from '../sassContext';
import { SassSourceContext } from '../SassSourceContext';
import { wrapSassContext } from '../wrapSassContext';

class SassDataContext implements SassSourceContext {
private readonly sassDataContextPtr: number;
private sassOptions: SassOptionsInterface | null;
private sassContext: SassContextInterface | null;

/**
*
*/
constructor(
input: string,
private readonly cwrapCtx: ReturnType<typeof wrapSassContext>,
private readonly strMethod: StringMethodInterface
) {
const inputPtr = this.strMethod.alloc(input);
this.sassDataContextPtr = this.cwrapCtx.make_data_context(inputPtr);
log(`SassDataContext: created new instance`, { sassDataContextPtr: this.sassDataContextPtr });
}

//Instead of reconstructing js object from raw pointer,
//returns reference of option instance already created.
public get options(): SassOptionsInterface | null {
const sassOptionPtr = this.cwrapCtx.data_context_get_options(this.sassDataContextPtr);

//internal access to raw pointer - interface doesn't expose it.
if (!!this.sassOptions && (this.sassOptions as SassOptions).sassOptionsPtr === sassOptionPtr) {
return this.sassOptions;
}
throw new Error(`Cannot get option`);
}

public set options(option: SassOptionsInterface | null) {
if (!option) {
throw new Error('Cannot set empty options');
}
this.sassOptions = null;
this.sassOptions = option;

//internal access to raw pointer - interface doesn't expose it.
this.cwrapCtx.data_context_set_options(this.sassDataContextPtr, (this.sassOptions as SassOptions).sassOptionsPtr);
}

public getContext(): SassContextInterface {
const sassContextPtr = this.cwrapCtx.data_context_get_context(this.sassDataContextPtr);
if (!!this.sassContext && (this.sassContext as SassContext).sassContextPtr !== sassContextPtr) {
throw new Error(`Unexpected: context has changed`);
}

return !!this.sassContext
? this.sassContext
: (this.sassContext = new SassContext(sassContextPtr, this.cwrapCtx, this.strMethod) as SassContextInterface);
}

public compile(): number {
return this.cwrapCtx.compile_data_context(this.sassDataContextPtr);
}

public dispose(): void {
this.cwrapCtx.delete_data_context(this.sassDataContextPtr);
}
}

export { SassDataContext };

0 comments on commit 4999714

Please sign in to comment.